OSL Texture Mapping [ซ้ำกัน]
ฉันยังใหม่กับ OSL และ Blender ฉันใช้รหัสต่อไปนี้เพื่อสร้างวงกลมบนเครื่องบิน อย่างไรก็ตามเครื่องบินดูเหมือนจะแบ่งออกเป็นสองรูปสามเหลี่ยม ใครช่วยอธิบายวิธีแก้ไขเพื่อให้วงกลม OSL ของฉันแมปถูกต้องได้ไหม ขอขอบคุณ!
shader Circle(
float rad=0.75 [[float min=0, float max=1]],
float sharp=0.8 [[float min=0, float max=1]],
int rep=1[[int min=1, int max=10]],
point cent=point(0.5, 0.5, 0),
output color c = 0)
{
point pt = point(rep*u, rep*v,0);
float ctx = floor(pt[0])+cent[0];
float cty = floor(pt[1])+cent[1];
point ct = point(ctx, cty, 0);
float d = fmod(distance(ct, pt), rep)/rad;
c = 1-smoothstep(0.5*sharp, 1-0.5*sharp, d);
}
คำตอบ
uและvเป็นตัวแปรทั่วโลกที่ OSL จัดเตรียมไว้ให้ พวกเขาอ้างถึงพาราเมตริก U และ V; พิกัด barycentric ที่ปรับมาตรฐานของจุดแรเงาในสามเหลี่ยมที่แรเงาในปัจจุบัน พวกมันคือ U และ V เดียวกันกับที่ส่งคืนในเวกเตอร์ 2 มิติที่คุณได้รับจากโหนดเรขาคณิต > เอาต์พุตพารามิเตอร์
ในการรับ U และ V ของรูปสี่เหลี่ยมตามที่แมปคุณต้องค้นหา U และ V จากแผนที่ UV ที่ใช้งานอยู่ของวัตถุโดยใช้getattribute():
shader Circle(
float radius = 0.75,
float sharpness = 0.8,
int tiles = 1,
point center = point(0.5, 0.5, 0.0),
output color c = (0.0)
)
{
vector UV = (0.0);
int hasUV = getattribute( "geom:uv", UV);
point pt = point(tiles*UV[0], tiles*UV[1],0);
float ctx = floor(pt[0])+center[0];
float cty = floor(pt[1])+center[1];
point ct = point(ctx, cty, 0);
float d = fmod(distance(ct, pt), tiles)/radius;
c = 1-smoothstep(0.5*sharpness, 1-0.5*sharpness, d);
}
.. แต่ที่นี่เราพบสัญญาที่ไม่เป็นจริงในคู่มือ Blender ซึ่งเมื่อพิจารณาจากอายุของคำตอบนี้คุณอาจคาดว่าจะได้รับการแก้ไขในตอนนี้ ที่น่าแปลกคือเท่าที่ผู้ใช้กังวลการใช้ OSL ของ Blender ปฏิเสธที่จะให้ค่าแก่geom:uvเว้นแต่จะมีโหนดImage Textureอยู่ที่ไหนสักแห่งในต้นไม้ (หากคุณต้องการประเมินแผนที่ UV อื่น ๆ ตามชื่อใน OSL ของคุณต้นไม้นั้นจะต้องมีโหนด UV Map ที่มีชื่อเหมือนกันซึ่งเชื่อมต่อกับโหนดImage Texture )
ดังนั้นต้นไม้ของคุณจึงมีลักษณะดังนี้:
ฉันหวังว่าคำตอบนี้จะช่วยคุณประหยัดเวลา .. :)