Version: Unity 6.0 (6000.0)
언어 : 한국어
빌트인 렌더 파이프라인의 셰이더 라이브러리에서 파일 임포트
GrabPass 커맨드로 현재 프레임버퍼 가져오기

빌트인 렌더 파이프라인에서 빌트인 셰이더 함수 사용

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 파일에는 위의 복잡성을 처리하기 위한 몇 가지 매크로가 포함되어 있습니다.

  • COMPUTE_EYEDEPTH(i): 버텍스의 눈 공간 뎁스를 계산하고 o 에서 출력합니다. 뎁스 텍스처로 렌더링하지 않을 때 버텍스 프로그램에서 이를 사용합니다.
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i): i 에서 고정밀도 값이 주어지면 해당 눈 공간 뎁스를 반환합니다.
  • Linear01Depth(i): 뎁스 텍스처 i 에서 고정밀도 값이 주어지면 해당 선형 뎁스를 0과 1 사이의 범위로 반환합니다.
  • UNITY_TRANSFER_DEPTH(o): 지원 중단되었습니다. 버텍스의 눈 공간 뎁스를 계산하고 o(float2여야 함)로 출력합니다. 네이티브 뎁스 텍스처가 있는 플랫폼에서는 Z 버퍼 값이 암시적으로 렌더링되기 때문에 이 매크로는 아무 작업도 수행하지 않습니다.
  • UNITY_OUTPUT_DEPTH(i): 지원 중단되었습니다. i(float2여야 함)에서 눈 공간 뎁스를 반환합니다. 네이티브 뎁스 텍스처가 있는 플랫폼에서는 Z 버퍼 값이 암시적으로 렌더링되므로 이 매크로는 항상 0을 반환합니다.

참고: 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
        }
    }
}
빌트인 렌더 파이프라인의 셰이더 라이브러리에서 파일 임포트
GrabPass 커맨드로 현재 프레임버퍼 가져오기