OSL Texture Mapping [ซ้ำกัน]

Dec 04 2020

ฉันยังใหม่กับ 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);

}

คำตอบ

1 RobinBetts Dec 04 2020 at 16:44

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 )

ดังนั้นต้นไม้ของคุณจึงมีลักษณะดังนี้:

ฉันหวังว่าคำตอบนี้จะช่วยคุณประหยัดเวลา .. :)