티스토리 뷰

Unity/Shader

Vertex Shader

연홍 2021. 1. 21. 11:07
728x90

vertex 셰이더가해야 할 가장 중요한 일은 mesh의 오브젝트공간위치에서 클립공간위치로 변환하는 것입니다. 이는 의도한 screen 위치에서 fragment를 올바르게 렌더링하기 위해 필요합니다.

 

빌트인 셰이더에서는 UnityObjectToClipPos 함수를 사용해서 작업을 수행 할 수 있지만이 이름은 TransformObjectToHClip (pipeline-core SpaceTransforms.hlsl에서 찾을 수 있음)으로 이름이 변경되었습니다. 즉, 아래와 같이 URP에서 변환을 처리하는 또 다른 방법이 있습니다.

Varyings vert(Attributes IN) {
    Varyings OUT;
 
    VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);
    OUT.positionCS = positionInputs.positionCS;
    // Or this :
    //OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
 
    OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
    OUT.color = IN.color;
    return OUT;
}

GetVertexPositionInputs는 다른 공간의 위치를 계산합니다. 이전에는 Core.hlsl의 일부 였지만 URP v9.x.x 버전의 자체 파일 인 ShaderVariablesFunctions.hlsl로 분리되었지만 Core.hlsl을 포함하면 자동으로 포함됩니다.

 

Attribute에서 객체공간위치를 입력하고 다음을 포함하는 VertexPositionInputs 구조체를 얻습니다.

  • positionWS, 세계 공간에서의 위치
  • positionVS, 뷰 공간에서의 위치
  • positionCS, 클립 공간에서의 위치
  • poritionNDC, 정규화된 장치 좌표의 위치 Normalised Device Coordinates

Unlit 셰이더에 대해 이러한 다른 좌표 공간의 위치는 필요하지 않지만, 우리가 하는 셰이더에는 유용합니다. 사용하지 않는 요소는 컴파일 된 셰이더에 포함되지 않으므로 불필요한 계산이 없습니다.

 

vertex 셰이더는 또한 데이터를 fragment로 전달하는 역할을합니다. vertex 컬러의 경우 단순하게

"OUT.color = IN.color;"입니다.

 

텍스처를 샘플링하려면 모델의 UV (텍스처 좌표)도 통과해야합니다. "OUT.uv = IN.uv;"만 할 수 있지만 (둘 다 float2라고 가정), 일반적으로 uv 및 텍스처 프로퍼티이름을 사용하고 마테리얼 인스펙터( "_BaseMap"+ "_ST"에 저장되어있는 오프셋 및 타일링을 적용하는 TRANSFORM_TEX 매크로, scale은S, translate은T)를 사용하는 것이 일반적입니다. 이 매크로는 내장 및 URP 모두에 있습니다 (Core.hlsl에 자동으로 포함되어있는 core/ShaderLibrary/Macros.hlsl 내부)

 

이것은 실제로 "IN.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw"의 약자입니다.

(_BaseMap말고 다른것으로 사용하려면, "(texture) _ST" float4 변수도 UnityPerMaterial CBUFFER에 추가해야합니다 (HLSL 섹션에서 설명)).

 

Unlit 셰이더에는 대한 노멀/탄젠트 데이터는 없지만 다음 내용은 있습니다.

VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);

GetVertexNormalInputs는 객체 공간의 normal과 tangent을 월드 공간으로 변환하는 데 사용할 수 있습니다. normalWS, tangentWS 및 bitangentWS 벡터를 포함합니다. tangentWS를 (1,0,0)으로 남겨두고 bitangentWS를 (0,1,0)으로 남겨 두는 입력으로 법선만 취하는 버전도 있습니다. 대신 TransformObjectToWorldNormal(IN.normalOS)를 사용할 수도 있습니다.

'Unity > Shader' 카테고리의 다른 글

Keywords & Shader Variants  (0) 2021.01.22
Fragment Shader  (0) 2021.01.21
Post Processing in the Universal RP  (0) 2021.01.20
Structs  (0) 2021.01.20
HLSL  (0) 2021.01.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30