티스토리 뷰
World space UVs
UV를 사용하여 셰이더에게 모델에 렌더링 할 텍스처 부분을 알려줍니다. 일반적으로 메시 UV 채널에 저장된 것을 사용하지만, 특히 사용 가능한 UV 좌표가없는 경우에는 fragment의 표준 공간 위치를 대신 사용하는 것도 유용 할 수 있습니다. 이것을 world space "투영(projected)된"(또는 정렬된) UV 및 평면 텍스처 매핑이라고도합니다.
그러나 Position 노드는 3D 벡터를 제공하며 Texture2D를 샘플링하는데 필요한 UV 좌표는 2차원입니다. 따라서 위치 벡터에서 두개의 구성요소만 사용할 수 있습니다. 예를 들어 X 및 Z 구성 요소 (split 노드에서 R및B로 표시됨)를 사용하여 텍스처를 샘플링 할 수 있습니다. Y축은 샘플에 포함되어 있지 않기 때문에 위/아래에서 텍스처를 "projecting"한 결과가 있습니다.
여기서는 스크롤링 텍스처 효과를 만들기 위해 시간이 지남에 따라 UV를 상쇄합니다. 물론 텍스처를 정적으로 만들고 싶다면 이것을 생략할 수 있습니다.
좌표가 월드 공간에 있기 때문에 장면에있는 오브젝트의 위치, 회전 및 배율은 좌표에 영향을주지 않습니다. 이것은 다른 크기에서도 여러평면을 사용할 수 있다는 장점이 있으며 텍스처가 원활하게 연결됩니다.
Multiply (또는 Tiling 및 Offset 노드 사용)를 통해 스케일링을 조정하고 Rotate 노드를 통해 회전을 변경할 수 있습니다. 크기 조정, 오프셋 및 회전 값이 개체간에 일관된 한 원활한 연결을 얻을 수 있습니다. 어떤 이유로 텍스처가 오브젝트와 함께 이동하도록하려면 오브젝트 노드에서 오브젝트의 월드 공간 위치를 사용하여 월드 공간 UV를 오프셋 할 수 있습니다. 그러나 이렇게하면 오프셋이 개체마다 다르기 때문에 여러 개체 간의 원활한 연결이 끊어 질 수 있습니다.
Triplanar Mapping
삼면 매핑은 WorldSpaceUV (또는 평면 매핑)를 사용하지만 각 축 방향에 대해 세번 사용합니다. 메쉬 세계 공간 Normal Vector를 기반으로 세가지 텍스처를 혼합합니다. 이는 UV가 텍스처를 너무 많이 늘리거나 메시에 사용할 수없는 경우에 유용 할 수 있습니다 (예 : UV를 생성하지 않는 절차적으로 생성된 콘텐츠).
삼면 매핑은 상당히 고급 주제로 간주 될 수 있지만 ShaderGraph에는 이에 대한 기본제공 노드가 있습니다. 하지만 텍스처 입력이 하나 뿐이지만 노드가 사용하는 코드는 입력이 더 많은 경우 여러 텍스처에서 쉽게 작업 할 수 있습니다.
위쪽 Y 축이 다른면 (음의 Y 축 포함)과 다른 텍스처를 갖도록하려면 추가 텍스처 샘플 2D 및 Normal Vector를 기반으로하는 마스크와 함께 Triplanar 노드를 사용할 수 있습니다.
다음과 같은 것이 작동합니다. 셰이더에 4개의 텍스처 샘플이 있습니다. 이는 나쁘지 않지만 현재는 알베도/색상만 샘플링하고 있습니다. 삼면 매핑을 사용하면서 메탈릭/스페큘러맵 또는 노멀맵을 적용하려는 경우 비용이 많이들 수 있습니다. 명확하게 말하면, 메시에 UV가 있는 경우 텍스처 간의 블렌드를 얻기 위해 삼면 매핑을 사용할 필요가 없습니다. 또한 Normal Vector 및 Lerp 노드를 사용하여 두개의 샘플텍스처2D노드 출력을 블렌딩 할 수 있습니다 (기본 UV을 사용하여 샘플링)
어떤 이유로 삼면 매핑의 각 축에 대해 다른 텍스처를 사용하려면 다중 텍스처 입력이 없기 때문에 삼면 노드가 수행하는 작업을 다시 만들어야합니다. 노드가 어떻게 작동하는지 확인하는데도 유용 할 수 있습니다. 이는 그래프 노드로 또는 사용자 정의 함수 노드를 통해 수행 할 수 있습니다. 문서 페이지에서 노드의 생성 된 코드를 복사 할 수 있으므로 커스텀 함수를 사용하는 것이 더 쉬울 수 있지만 아래에 노드 버전도 포함했습니다.
Multi-texture Triplanar (Albedo/Colour, using Nodes)
아래는 Triplanar 노드가 수행하는 작업을 복제하는 그래프입니다 (기본 유형 설정 사용). 각 샘플 텍스처 2D에 액세스 할 수 있으므로 각 노드에 서로 다른 텍스처를 연결할 수 있습니다. 혼합 기능은 각 축의 양쪽이 혼합되기를 원하기 때문에 절대 값을 사용하여 음수 값을 양수로 뒤집는 법선 벡터를 기반으로합니다. Power는 블렌딩의 양을 제어하며, Blend Vector1 속성 값이 높을수록 텍스처 간의 블렌딩이 더 선명 해집니다. Dot Product 및 Divide 부분은 텍스처가 없으면 결과가 더 어둡게 보이기 때문에 텍스처의 올바른 밝기를 유지하는 것입니다. 각 텍스처의 타일링을 개별적으로 제어하려면 Vector2와 Sample Texture 2D 노드 사이에 Tiling 및 Offset 노드를 추가합니다.
Multi-texture Triplanar (Albedo/Colour, using Custom Function)
void MultitextureTriplanar_float(Texture2D TextureA, Texture2D TextureB, Texture2D TextureC, SamplerState Sampler,
float3 Position, float3 Normal, float Tile, float Blend, out float4 Out){
float3 Node_UV = Position * Tile;
float3 Node_Blend = pow(abs(Normal), Blend);
Node_Blend /= dot(Node_Blend, 1.0);
float4 Node_X = SAMPLE_TEXTURE2D(TextureA, Sampler, Node_UV.zy);
float4 Node_Y = SAMPLE_TEXTURE2D(TextureB, Sampler, Node_UV.xz);
float4 Node_Z = SAMPLE_TEXTURE2D(TextureC, Sampler, Node_UV.xy);
Out = Node_X * Node_Blend.x + Node_Y * Node_Blend.y + Node_Z * Node_Blend.z;
}
Custom Function 노드를 사용하는 데 약간의 단점이 있습니다. Shadergraph는 전달 된 텍스처 입력 (텍스처 필터 및 랩 모드 포함)과 관련된 샘플러를 사용하는 방법이없는 것 같습니다. 샘플 텍스처 2D 노드 만이 주어진 텍스처에 대해 자동으로 샘플러를 사용할 수있는 것 같습니다. 사용자 정의 함수의 경우 대신 샘플러를 전달해야하며 입력을 비워두면 선형 필터링 및 반복 랩 모드의 기본값이 사용됩니다.
참고
cyangamedev.wordpress.com/2020/01/28/worldspace-uvs-triplanar-mapping/
https://docs.unity3d.com/Packages/com.unity.shadergraph@7.1/manual/Triplanar-Node.html
https://www.patreon.com/posts/quick-game-art-16714688
https://catlikecoding.com/unity/tutorials/advanced-rendering/triplanar-mapping/
http://www.martinpalko.com/triplanar-mapping/
https://medium.com/@bgolus/normal-mapping-for-a-triplanar-shader-10bf39dca05a
'Unity > Shader Graph' 카테고리의 다른 글
Orthographic Depth (0) | 2021.01.19 |
---|---|
UV-Based Nodes (3) | 2021.01.18 |
Screen Position (0) | 2021.01.15 |
Voronoi (0) | 2021.01.15 |
Render Texture (0) | 2021.01.14 |
- Total
- Today
- Yesterday