Version: Unity 6.0 (6000.0)
언어 : 한국어
여러 프로그램에서 HLSL 복제
텍스처 샘플러

버텍스 데이터를 셰이더에 입력

Cg/HLSL 버텍스 프로그램의 경우 메시 버텍스 데이터는 버텍스 셰이더 함수에 입력으로 전달됩니다. 각 입력에는 입력에 대해 지정된 시맨틱이 있어야 합니다. 예를 들어, POSITION 입력은 버텍스 포지션이고 NORMAL은 버텍스 노멀입니다.

버텍스 데이터 입력은 하나씩 나열되지 않고 구조로 선언됩니다.

빌트인 버텍스 구조 입력

몇 가지 일반적으로 사용되는 버텍스 구조는 UnityCG.cginc include 파일에 정의되며, 대부분의 경우 이러한 구조를 사용하면 충분합니다. 구조는 다음과 같습니다.

  • appdata_base: 위치, 노멀, 하나의 텍스처 좌표
  • appdata_tan: 위치, 탄젠트, 노멀, 하나의 텍스처 좌표
  • appdata_full: 위치, 탄젠트, 노멀, 네 개의 텍스처 좌표, 컬러
  • appdata_img: 위치와 텍스처 좌표 1개를 포함한 버텍스 셰이더 입력

예제

셰이더는 메시의 노멀에 기반하여 메시에 컬러를 칠하며, 버텍스 프로그램 입력으로 appdata_base를 사용합니다.

Shader "VertexInputSimple" {
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
         
            struct v2f {
                float4 pos : SV_POSITION;
                fixed4 color : COLOR;
            };
            
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color.xyz = v.normal * 0.5 + 0.5;
                o.color.w = 1.0;
                return o;
            }

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

커스텀 버텍스 구조 입력

다양한 버텍스 데이터에 액세스하려면 버텍스 구조를 직접 선언하거나 버텍스 셰이더에 입력 파라미터를 추가해야 합니다. 버텍스 데이터는 Cg/HLSL 시맨틱으로 식별되며 다음 목록에서 가져와야 합니다.

  • POSITION은 버텍스 위치로, 일반적으로 float3 또는 float4입니다.
  • NORMAL은 버텍스 노멀이며 보통 float3입니다.
  • TEXCOORD0는 첫 번째 UV 좌표로, 일반적으로 float2, float3 또는 float4입니다.
  • TEXCOORD1, TEXCOORD2, TEXCOORD3은 각각 두 번째, 세 번째 및 네 번째 UV 좌표입니다.
  • TANGENT는 탄젠트 벡터(노멀 매핑에 사용됨)이며 보통 float4입니다.
  • COLOR는 버텍스당 컬러이며 보통 float4입니다.

메시 데이터에 버텍스 셰이더 입력에 필요한 것보다 컴포넌트가 적으면 나머지는 0으로 채워집니다(기본값은 1인 .w 컴포넌트 제외). 예를 들어 메시 텍스처 좌표는 x 및 y 컴포넌트만 있는 2D 벡터일 수 있습니다. 버텍스 셰이더가 TEXCOORD0 시맨틱으로 float4 입력을 선언하는 경우 버텍스 셰이더가 수신하는 값은 (x,y,0,1)을 포함합니다.

최상의 크로스 플랫폼 지원을 위해서는 버텍스 출력과 프래그먼트 입력을 TEXCOORDn 시맨틱으로 레이블 지정해야 합니다.

Unity는 다음 플랫폼도 지원합니다.

  • VPOS - 렌더링되는 픽셀의 위치입니다. 셰이더에는 #pragma target 3.0 컴파일 지시문이 있어야 하며, 클립 공간 위치를 별도의 ‘out’ 변수로 출력해야 합니다. 이식성을 최대한 높이려면 대부분의 플랫폼에서 float4UNITY_VPOS_TYPE 유형을 사용하십시오.
  • VFACE - 렌더링된 표면이 카메라를 향하는지 카메라 반대쪽을 향하는지 여부를 나타냅니다. 셰이더에는 #pragma target 3.0 컴파일 지시문이 있어야 합니다.
  • SV_VertexID - 처리 중인 버텍스의 인덱스입니다. 셰이더에는 #pragma target 3.5 컴파일 지시문이 있어야 합니다.

이러한 기법을 사용하여 빌트인 렌더 파이프라인에서 버텍스 데이터를 시각화하는 방법의 예시는 버텍스 데이터 시각화를 참조하십시오.

상수 버퍼 매크로

Direct3D 11은 모든 셰이더 변수를 ‘상수 버퍼’로 그룹화합니다. Unity의 빌트인 변수는 대부분 이미 그룹화되어 있지만, 자체 셰이더에 있는 변수의 경우 예상 업데이트 빈도에 따라 개별 상수 버퍼에 넣는 것이 더 최적일 수 있습니다.

이를 위해 CBUFFER_START(name)CBUFFER_END 매크로를 사용합니다.

CBUFFER_START(MyRarelyUpdatedVariables)
    float4 _SomeGlobalValue;
CBUFFER_END

GPU 컴퓨트 버퍼 또는 그래픽스 버퍼를 사용하여 변수 값을 설정하는 경우, 빌드하는 모든 그래픽스 API에서 버퍼와 상수 버퍼의 데이터 레이아웃이 일치하는지 확인합니다. 자세한 내용은 GPU 버퍼와 함께 상수 버퍼 사용을 참조하십시오.

참고: 상수 버퍼에 구조체를 추가할 수 없습니다.

인터폴레이터 개수 한계

버텍스에서 프래그먼트 셰이더로 정보를 넘기는 데 사용할 수 있는 전체 인터폴레이터 변수 개수에는 제한이 있습니다. 이 제한은 플랫폼 및 GPU에 따라 달라지며 일반적인 가이드라인은 다음과 같습니다.

  • 인터폴레이터 최대 8개: Direct3D 11 9.x 레벨(Windows Phone). 인터폴레이터 개수에 제한이 있지만 각 인터폴레이터는 4-컴포넌트 벡터가 될 수 있으며 일부 셰이더는 제한을 충족하기 위하여 여러가지를 합칩니다. 예를 들어, 텍스처 좌표 2개를 float4 변수 하나로(첫 번째 좌표는 .xy로, 두 번째 좌표는 .zw로) 패스할 수 있습니다.
  • 인터폴레이터 최대 10개: 셰이더 모델 3.0(#pragma target 3.0).
  • 인터폴레이터 최대 16개: OpenGL ES 3.0(Android), Metal(iOS).
  • 인터폴레이터 최대 32개: Direct3D 10 셰이더 모델 4.0(#pragma target 4.0).

특정 타겟 하드웨어에 상관 없이 일반적으로 성능상의 이유로 인터폴레이터를 최소한으로 사용하는 것이 좋습니다.

추가 리소스

여러 프로그램에서 HLSL 복제
텍스처 샘플러