Unity에는 셰이더를 더 간단하고 쉽게 작성할 수 있도록 UnityCG.cginc에 빌트인 유틸리티 함수가 있습니다.
| 기능: | 설명: |
|---|---|
float4 UnityObjectToClipPos(float3 pos) |
오브젝트 공간에서 카메라의 클립 공간으로 포인트를 균일한 좌표로 변환합니다. mul(UNITY_MATRIX_MVP, float4(pos, 1.0))과 같으며, 이를 대신하여 사용해야 합니다. |
float3 UnityObjectToViewPos(float3 pos) |
포인트를 오브젝트 공간에서 뷰 공간으로 변환합니다. 이는 __mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz__와 같으며, 이를 대신하여 사용해야 합니다. |
| 기능: | 설명: |
|---|---|
float3 WorldSpaceViewDir (float4 v) |
월드 공간 방향(정규화되지 않음)을 주어진 오브젝트 공간 버텍스 위치에서 카메라 쪽으로 되돌립니다. |
float3 ObjSpaceViewDir (float4 v) |
오브젝트 공간 방향(정규화되지 않음)을 주어진 오브젝트 공간 버텍스 위치에서 카메라 쪽으로 되돌립니다. |
float2 ParallaxOffset (half h, half height, half3 viewDir) |
패럴랙스 노멀 매핑의 UV 오프셋을 계산합니다. |
fixed Luminance (fixed3 c) |
컬러를 휘도(그레이스케일)로 변환합니다. |
fixed3 DecodeLightmap (fixed4 color) |
Unity 라이트맵에서 컬러를 디코딩합니다(플랫폼에 따라 RGBM 또는 dLDR). |
float4 EncodeFloatRGBA (float v) |
정밀도가 낮은 렌더링 타겟에 저장하기 위해 (0–1) 범위 플로트를 RGBA 컬러로 인코딩합니다. |
float DecodeFloatRGBA (float4 enc) |
RGBA 컬러를 플로트로 디코딩합니다. |
float2 EncodeFloatRG (float v) |
(0–1) 범위 플로트를 float2로 인코딩합니다. |
float DecodeFloatRG (float2 enc) |
이전에 인코딩된 RG 플로트를 디코딩합니다. |
float2 EncodeViewNormalStereo (float3 n) |
뷰 공간 노멀을 범위가 0–1인 숫자 2개로 인코딩합니다. |
float3 DecodeViewNormalStereo (float4 enc4) |
뷰 공간 노멀을 enc4.xy에서 디코딩합니다. |
이 함수는 포워드 렌더링(ForwardBase 또는 ForwardAdd 패스 유형)을 사용하는 경우에만 유용합니다.
| 기능: | 설명: |
|---|---|
float3 WorldSpaceLightDir (float4 v) |
광원을 향한 월드 공간 방향(정규화되지 않음)을 주어진 오브젝트 공간 버텍스 위치에 대해 계산합니다. |
float3 ObjSpaceLightDir (float4 v) |
광원을 향한 오브젝트 공간 방향(정규화되지 않음)을 주어진 오브젝트 공간 버텍스 위치에 대해 계산합니다. |
float3 Shade4PointLights (...) |
점 광원 4개의 조명을 계산하며, 광원 데이터는 벡터에 조밀하게 패킹됩니다. 포워드 렌더링은 이를 사용하여 버텍스당 조명을 계산합니다. |
다음 함수는 스크린 공간 텍스처 샘플링에 사용되는 좌표를 계산하는 데 도움이 됩니다. 원근 분할(예: xy/w)을 통해 텍스처를 샘플링할 최종 좌표를 계산할 수 있는 float4를 반환합니다.
함수는 렌더 텍스처 좌표의 플랫폼 차이도 처리합니다.
| 기능: | 설명: |
|---|---|
float4 ComputeScreenPos (float4 clipPos) |
화면 공간 매핑된 텍스처 샘플링을 수행하기 위한 텍스처 좌표를 계산합니다. 입력은 클립 공간 위치입니다. |
float4 ComputeGrabScreenPos (float4 clipPos) |
GrabPass 텍스처 샘플링을 위한 텍스처 좌표를 계산합니다. 입력은 클립 공간 위치입니다. |
함수는 버텍스당 릿 셰이더(‘Vertex’ 패스 유형)를 사용하는 경우에만 유용합니다.
| 기능: | 설명: |
|---|---|
float3 ShadeVertexLights (float4 vertex, float3 normal) |
버텍스당 광원 및 앰비언트 4개의 조명을 주어진 오브젝트 공간 위치 및 노멀에 대해 계산합니다. |
플랫폼에 따라 섀도우 맵을 선언하고 샘플링하는 방법이 크게 다를 수 있습니다. Unity에는 다음과 같은 여러 매크로가 있습니다.
| 매크로: | 용도: |
|---|---|
UNITY_DECLARE_SHADOWMAP(tex) |
이름이 ’tex’인 섀도우맵 텍스처 변수를 선언합니다. |
UNITY_SAMPLE_SHADOW(tex,uv) |
주어진 ‘uv’ 좌표에서 ‘tex’ 섀도우맵 텍스처를 샘플링합니다. XY 컴포넌트는 텍스처 위치이며, Z 컴포넌트는 비교할 뎁스입니다. 섀도우 텀 범위가 0–1인 플로트 값을 1개 반환합니다. |
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) |
위와 유사하나, 투사 섀도우맵 읽기를 수행합니다. ’uv’는 float4이고 나머지 컴포넌트는 룩업 수행을 위해 .w로 나눕니다. |
tex의 포맷은 RenderTextureFormat.Shadowmap이어야 합니다.
참고: 모든 그래픽 카드가 섀도우 맵을 지원하지는 않습니다. 지원 여부를 확인하려면 SystemInfo.SupportsRenderTextureFormat을 사용합니다.
대부분의 경우 뎁스 텍스처는 카메라의 뎁스를 렌더링하는 데 사용됩니다. 이 경우 UnityCG.cginc include 파일에는 위의 복잡성을 처리하기 위한 몇 가지 매크로가 포함되어 있습니다.
참고: DX11/12 및 Metal에서 Z 버퍼 범위는 1–0이고 UNITY_REVERSED_Z가 정의됩니다. 다른 플랫폼에서는 범위가 0–1입니다.
예를 들어, 다음 셰이더는 게임 오브젝트의 뎁스를 렌더링합니다.
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}