OSL 텍스처 매핑 [중복]
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를 참조합니다 . 현재 음영 처리 된 삼각형에있는 음영 지점 의 정규화 된 무게 중심 좌표 입니다. Geometry 노드> Parametric 출력 에서 얻은 2D 벡터에서 반환되는 것과 동일한 U 및 V 입니다.
매핑 된 쿼드의 U 및 V를 얻으려면 다음을 사용하여 오브젝트의 활성 UV 맵에서 U 및 V를 찾아야합니다 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 구현은 트리 어딘가에 이미지 텍스처 노드 geom:uv
가 없으면에 값을 제공 하지 않습니다 . (OSL에서 이름으로 다른 UV 맵을 평가하려면 트리에 이미지 텍스처 노드에 연결된 이름이 비슷한 UV 맵 노드도 포함되어야 합니다.)
따라서 나무는 다음과 같이 보입니다.

이 답변이 시간을 절약하기를 바랍니다 .. :)