Mapowanie tekstur OSL [duplikat]
Jestem nowy w OSL i Blenderze. Używam następującego kodu, aby wygenerować okrąg na płaszczyźnie. Jednak płaszczyzna wydaje się być podzielona na dwa trójkąty. Czy ktoś może wyjaśnić, jak to naprawić, aby moje koło OSL było poprawnie zmapowane? Dziękuję Ci!
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);
}

Odpowiedzi
u
i v
są zmiennymi globalnymi dostarczanymi przez OSL. Odnoszą się do parametrycznych U i V; znormalizowane współrzędne barycentryczne punktu zacienienia w aktualnie zacienionym trójkącie. Mają one takie same U i V, jakie są zwracane w wektorze 2D otrzymanym z węzła Geometry > Dane wyjściowe parametryczne .
Aby uzyskać U i V kwadratu, zgodnie z mapą, musisz wyszukać U i V z aktywnej mapy UV obiektu, używając 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);
}
.. ale tutaj natknęliśmy się na niespełnioną obietnicę w podręczniku Blendera, którą sądząc po wieku tej odpowiedzi , można się spodziewać, że została już naprawiona. Co dziwne, z punktu widzenia użytkownika implementacja OSL w Blenderze odmawia podania wartości geom:uv
, chyba że gdzieś w drzewie znajduje się węzeł Tekstura obrazu . (Jeśli chcesz ocenić inną mapę UV według nazwy w swoim OSL, drzewo musi również zawierać węzeł mapy UV o podobnej nazwie, połączony z węzłem Tekstura obrazu ).
Więc twoje drzewo kończy się tak:

Mam nadzieję, że ta odpowiedź pozwoli Ci zaoszczędzić trochę czasu .. :)