Shader) CGPROGRAM, HLSLPROGRAM
Unity의 셰이더는 ShaderLab과 GPU 프로그래밍 언어(HLSL/Cg)를 함께 사용하여 작성된다.
CGPROGRAM ~ ENDCG 사이에 GPU에서 실행될 코드를 작성해야 한다.
Unity는 예전부터 Cg 언어를 기반으로 했지만, 현재는 HLSL이 공식적으로 사용된다.
따라서 CGPROGRAM 대신 HLSLPROGRAM을 사용할 수 있다.
-
CGPROGRAM은 GPU에서 실행될 셰이더 코드 작성 영역
-
HLSLPROGRAM을 사용하면 최신 Unity(URP, HDRP)에서도 호환 가능
CGPROGRAM과 HLSLPROGRAM 비교
CGPROGRAM (기존 Unity 셰이더)
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t { … };
struct v2f { … };
v2f vert (appdata_t v) { … }
fixed4 frag (v2f i) : SV_Target { … }
ENDCG
}
- Cg 기반의 셰이더 코드 작성
- #pragma vertex, #pragma fragment 를 사용하여 각 단계의 함수 지정
- UnityCG.cginc를 포함하여 유틸리티 함수 사용 가능
HLSLPROGRAM (최신 Unity 버전, URP/HDRP 호환)
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
struct appdata_t { … };
struct v2f { … };
v2f vert (appdata_t v) { … }
float4 frag (v2f i) : SV_Target { … }
ENDHLSL
}
- HLSL 기반의 최신 셰이더 코드
- CGPROGRAM 대신 HLSLPROGRAM 사용
- ENDCG 대신 ENDHLSL 사용
- UnityCG.cginc 대신 Common.hlsl 포함
URP(HDRP)와 호환되는 최신 셰이더 코드 작성 가능
CGPROGRAM / HLSLPROGRAM 적용 예제
기본 CGPROGRAM을 사용하는 셰이더
Shader "Custom/CGExample"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.uv, 0, 1);
}
ENDCG
}
}
}
CGPROGRAM을 사용하여 기본적인 UV 색상 셰이더 구현
HLSLPROGRAM을 사용하는 최신 셰이더
Shader "Custom/HLSLExample"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata_t v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex); // URP, HDRP에서 사용하는 변환 함수
o.uv = v.uv;
return o;
}
float4 frag (v2f i) : SV_Target
{
return float4(i.uv, 0, 1);
}
ENDHLSL
}
}
}
HLSLPROGRAM을 사용하여 최신 Unity(URP, HDRP)에서 호환 가능하도록 작성
버텍스 변환 함수(TransformObjectToHClip
)를 사용하여 HLSL 스타일로 변환
댓글남기기