Pemetaan Tekstur OSL [duplikat]

Dec 04 2020

Saya baru mengenal OSL dan Blender. Saya menggunakan kode berikut untuk menghasilkan lingkaran di pesawat. Pesawat, bagaimanapun, tampaknya terbagi menjadi dua segitiga. Adakah yang bisa menjelaskan cara memperbaikinya sehingga lingkaran OSL saya dipetakan dengan benar? Terima kasih!

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);

}

Jawaban

1 RobinBetts Dec 04 2020 at 16:44

udan vmerupakan variabel global yang disediakan oleh OSL. Mereka mengacu pada parametrik U dan V; koordinat barycentric yang dinormalisasi dari titik naungan dalam segitiga yang saat ini diarsir. Mereka adalah U dan V yang sama seperti yang dikembalikan dalam vektor 2D yang Anda dapatkan dari simpul Geometri > keluaran Parametrik .

Untuk mendapatkan U dan V dari quad, seperti yang dipetakan, Anda harus mencari U dan V dari peta UV aktif objek, menggunakan 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);
}

.. tapi di sini, kami menemui janji yang tidak terpenuhi di manual Blender, yang dilihat dari usia jawaban ini , Anda mungkin berharap sudah diperbaiki sekarang. Anehnya, sejauh menyangkut pengguna, implementasi OSL Blender menolak untuk memberikan nilai geom:uv, kecuali jika ada simpul Tekstur Gambar di suatu tempat di pohon. (Jika Anda ingin mengevaluasi beberapa peta UV lainnya berdasarkan nama di OSL Anda, pohon tersebut juga harus berisi node Peta UV yang memiliki nama serupa, yang terhubung ke node Tekstur Gambar .)

Jadi, pohon Anda akan terlihat seperti ini:

Saya harap jawaban ini menghemat waktu Anda .. :)