Triplanar 노드
설명
Triplanar는 UV를 생성하고 월드 공간에 투사하여 텍스처를 샘플링하는 방법입니다. Texture 입력은 3번 샘플링(월드 x축, y축 및 z축에서 각각 한 번)됩니다. 결과 정보는 모델에 투사되고 노멀로 블렌딩되는 평면이거나 표면 각도입니다. 생성되는 UV는 Tile 입력으로 스케일링할 수 있으며, 최종 블렌딩 강도는 Blend 입력으로 제어할 수 있습니다. Blend는 노멀이 각 평면 샘플의 블렌딩에 영향을 미치는 방식을 제어하며, 0보다 크거나 같아야 합니다. Blend가 클수록 노멀이 가장 많이 향하는 평면의 샘플에 더 많이 기여합니다. (최대 블렌드 지수는 플랫폼과 노드의 정밀도에 따라 17에서 158 사이입니다.) 블렌드가 0이면 각 평면이 노멀 방향에 관계없이 동일한 가중치를 갖습니다. 투사는 Position 및 Normal 입력을 오버라이드하여 수정할 수 있습니다. 이는 일반적으로 터레인과 같은 대형 모델을 텍스처링하는 데 사용됩니다. 이러한 경우 UV 좌표를 수동으로 작성하는 데 문제가 있거나 성능이 저하될 수 있습니다.
Texture 입력의 예상되는 타입은 Type 드롭다운에서 전환할 수 있습니다. Normal로 설정하면 노멀이 월드 공간으로 전환되므로, 새 탄젠트를 구성한 후 출력 전에 노멀 공간으로 다시 전환할 수 있습니다.
Custom Function 노드 또는 하위 그래프가 포함된 그래프에서 이 노드를 사용하는 동안 텍스처 샘플링 오류가 발생하면 10.3 이상 버전으로 업그레이드하여 해결할 수 있습니다.
참고: 이 노드는 프래그먼트 셰이더 단계에서만 사용할 수 있습니다.
포트
이름 | 방향 | Type | 바인딩 | 설명 |
---|---|---|---|---|
Texture | 입력 | Texture | None | 입력 텍스처 값 |
Sampler | 입력 | 샘플러 상태 | None | 텍스처 입력의 샘플러 |
Position | 입력 | 벡터 3 | 월드 공간 포지션 | 프래그먼트 포지션 |
Normal | 입력 | 벡터 3 | 월드 공간 노멀 | 프래그먼트 노멀 |
Tile | 입력 | 플로트 | None | 생성된 UV에 대한 타일링 양 |
Blend | 입력 | 플로트 | None | 서로 다른 샘플 간의 블렌드 인자 |
Out | 출력 | 벡터 4 | None | 출력 값 |
컨트롤
이름 | Type | 옵션 | 설명 |
---|---|---|---|
Type | 드롭다운 | Default, Normal | Texture 입력의 타입 |
생성된 코드 예제
다음 예제 코드는 이 노드의 가능한 결과 중 하나입니다.
Default
float3 Node_UV = Position * Tile;
float3 Node_Blend = pow(abs(Normal), Blend);
Node_Blend /= dot(Node_Blend, 1.0);
float4 Node_X = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.zy);
float4 Node_Y = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xz);
float4 Node_Z = SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xy);
float4 Out = Node_X * Node_Blend.x + Node_Y * Node_Blend.y + Node_Z * Node_Blend.z;
Normal
float3 Node_UV = Position * Tile;
float3 Node_Blend = max(pow(abs(Normal), Blend), 0);
Node_Blend /= (Node_Blend.x + Node_Blend.y + Node_Blend.z ).xxx;
float3 Node_X = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.zy));
float3 Node_Y = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xz));
float3 Node_Z = UnpackNormal(SAMPLE_TEXTURE2D(Texture, Sampler, Node_UV.xy));
Node_X = float3(Node_X.xy + Normal.zy, abs(Node_X.z) * Normal.x);
Node_Y = float3(Node_Y.xy + Normal.xz, abs(Node_Y.z) * Normal.y);
Node_Z = float3(Node_Z.xy + Normal.xy, abs(Node_Z.z) * Normal.z);
float4 Out = float4(normalize(Node_X.zyx * Node_Blend.x + Node_Y.xzy * Node_Blend.y + Node_Z.xyz * Node_Blend.z), 1);
float3x3 Node_Transform = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);
Out.rgb = TransformWorldToTangent(Out.rgb, Node_Transform);