정점 색상 지원

2022. 7. 10. 17:54Public/Shader

기본적으로 정점과 함께 보간을 수행하는 레스터라이저에 전달할 또 다른 값을 전달한다.

 

 

 

Appdata에 추가하기

appdata에 메시 정점 색상을 채울 멤버를 추가하려면 멤버의 이름과 시맨틱에 주의해야 한다. 권장하는 방법은 멤버의 이름을 color로 하고 COLOR 시맨틱을 추가하는것이다. 플랫폼에 따라 변수 이름을 다르게 하고 시맨틱 이름만을 COLOR로 하는 경우 제대로 동작하지 않을 수도 있다. 정점 색상 멤버 변수를 추가한 후 이 구조체의 모습은 다음과 같다.

struct appdata
{
  float4 vertex : POSITION;
  float4 color : COLOR;
}

 

v2f에 추가하기

v2f에 정확히 동일한 멤버 변수를 추가해야한다. 

struct v2f
{
   float4 vertex : SV_POSITION;
   float4 color : COLOR; 
};

 

정점 함수에 색상할당

이 한줄에서 appdata의 색상 멤버 변수를 v2f의 색상 멤버 변수로 할당한다. 이를 통해서 정점 색상 데이터가 레스터라이저를 통과하며, 레스터라이저는 색상을 적당히 보간할 것이다.

 

v2f vert (appdata v)
{
   v2f o;
   o.vertex = UnityObjectToClipPos(v.vertex);
   o.color = v.color;
   return o;
}

 

 

 

프레그먼트 함수에서 색상값 사용

v2f에 담겨있는 보간된 값을 출력해보자.

 

[전체코드]

Shader "Custom/RasterizerTestShader"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float4 color : COLOR;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 color : COLOR;
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.color = v.color;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return i.color;
            }
            ENDCG
        }
    }
}

 

 

 

결과

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

커스텀 라이팅  (0) 2022.07.17
좌표 공간  (0) 2022.07.10
프레그먼트 데이터 구조체 & 프레그먼트 함수  (0) 2022.07.10
정점 함수  (0) 2022.07.10
정점 데이터(appdata) 구조체  (0) 2022.07.10