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

uvOSL 의해 제공된 전역 변수이다. 그들은 파라 메트릭 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 맵 노드도 포함되어야 합니다.)

따라서 나무는 다음과 같이 보입니다.

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