내장 쉐이더 include 파일
Built-in shader helper functions

정의된 쉐이더 전처리 매크로(Predefined shader preprocessor macros)

Unity defines several preprocessor macros when compiling shader programs.

타겟 플랫폼

Macro: ##타겟 플랫폼
SHADER_API_D3D9 Direct3D 9
SHADER_API_D3D11 Direct3D 11
SHADER_API_GLCORE Desktop OpenGL “core” (GL 3/4)
SHADER_API_OPENGL Legacy desktop OpenGL (GL 2)
SHADER_API_GLES OpenGL ES 2.0
SHADER_API_GLES3 OpenGL ES 3.0/3.1
SHADER_API_METAL iOS/Mac Metal
SHADER_API_D3D11_9X Direct3D 11 “feature level 9.x” target for Windows Store and Windows Phone
SHADER_API_PSSL PlayStation 4
SHADER_API_XBOXONE Xbox One
SHADER_API_PS3 PlayStation 3
SHADER_API_XBOX360 Xbox 360
SHADER_API_PSP2 PlayStation Vita
SHADER_API_WIIU Nintendo WiiU

SHADER_API_MOBILE is defined for all general mobile platforms (GLES, GLES3, METAL, PSP2).

추가적으로, 쉐이더 언어의 대상이 GLSL인 경우, SHADER_TARGET_GLSL을 정의합니다. (OpenGL/GLES플랫폼에서는 항상 true)

Shader target model

SHADER_TARGET is defined to a numeric value that matches the shader target compilation model (i.e. matching #pragma target directive). For example, SHADER_TARGET is 30 when compiling into shader model 3.0. You can use it in shader code to do conditional checks. For example:

#if SHADER_TARGET < 30
    // less than shader model 3.0:
    // very limited shader capabilities, do some approximation
#else
    // decent capabilities, do a better thing
#endif

Unity version

UNITY_VERSION contains the numeric value of the Unity version. For example, UNITY_VERSION is 501 for Unity 5.0.1. This can be used for version comparisons if you need to write shaders that use different built-in shader functionality. For example, a #if UNITY_VERSION >= 500 preprocessor check will only pass on versions 5.0.0 or later.

플랫폼 차이 헬퍼

플랫폼 매크로를 직접 사용하는 것은, 장래성을 충분히 고려하고 있지 않기 때문에 권장하지 않습니다. 예를 들어, D3D9을 확인하는 쉐이더를 작성한 경우, 장래에 D3D11을 체크해야 할 지도 모릅니다. 대안으로 Unity는 여러 헬퍼 매크로를 HLSLSupport.cginc에서 정의하고 도움을 줍니다.

Macro: Use:
UNITY_BRANCH Add this before conditional statements to tell the compiler that this should be compiled into an actual branch. Expands to [branch] when on HLSL platforms.
UNITY_FLATTEN Add this before conditional statements to tell the compiler that this should be flattened to avoid an actual branch instruction. Expands to [flatten] when on HLSL platforms.
UNITY_NO_SCREENSPACE_SHADOWS Defined on platforms that do not use cascaded screenspace shadowmaps (mobile platforms).
UNITY_NO_LINEAR_COLORSPACE Defined on platforms that do not support Linear color space (mobile platforms).
UNITY_NO_RGBM Defined on platforms where RGBM compression for lightmaps is not used (mobile platforms).
UNITY_NO_DXT5nm Defined on platforms that do not use DXT5nm normal-map compression (mobile platforms).
UNITY_FRAMEBUFFER_FETCH_AVAILABLE Defined on platforms where “framebuffer color fetch” functionality can be available (generally iOS platforms - OpenGL ES 2.0, 3.0 and Metal).
UNITY_USE_RGBA_FOR_POINT_SHADOWS Defined on platforms where point light shadowmaps use RGBA textures with encoded depth (other platforms use single-channel floating point textures).
UNITY_ATTEN_CHANNEL * UNITY_ATTEN_CHANNEL - Light Attenuation(라이트 감쇠) 텍스처의 어느 채널이 데이터를 보유하고 있는지, 픽셀 당 라이팅 코드에서 사용됩니다. ‘r’ 또는 ’a’로 정의됩니다.
UNITY_HALF_TEXEL_OFFSET * UNITY_HALF_TEXEL_OFFSET - Texel(텍셀)을 픽셀에 매핑하기 위해 half-texel 오프셋이 필요한 플랫폼 정의( Direct3D 9 같은).
UNITY_UV_STARTS_AT_TOP * UNITY_UV_STARTS_AT_TOP - 항상 1 또는 0으로 정의. 1의 값은 “텍스처의 상단에서” 텍스처의 V 좌표가 0인 플랫폼에 사용합니다. Direct3D와 같은 플랫폼에서는 1을 사용하고, Open-GL과 같은 플랫폼에서는 0을 사용합니다.
UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE * UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE - 플랫폼에서 그림자 맵이나 깊이 텍스쳐를 수동으로 텍스쳐에 에뮬레이트 하는 경우에 정의합니다.
UNITY_PROJ_COORD(a) * UNITY_PROJ_COORD (a) - 4 개의 벡터 구성요소를 전달하면 투영된 텍스처 읽기에 적절한 텍스처 좌표를 리턴합니다. 대부분의 플랫폼에서는 전달된 값 자체를 리턴합니다.
UNITY_NEAR_CLIP_VALUE * UNITY_NEAR_CLIP_VALUE - 니어 클리핑 플레인으로 정의된 값, Direct3D와 같은 플랫폼은 0.0이 사용되는 동안 OpenGL 같은 플랫폼에서는 –1.0을 사용합니다.
UNITY_VPOS_TYPE Defines the data type required for pixel position input (VPOS): float2 on D3D9, float4 elsewhere.
UNITY_CAN_COMPILE_TESSELLATION * UNITY_CAN_COMPILE_TESSELLATION - 쉐이더 컴파일러가 테셀레이션 쉐이더 HLSL 문법을 “이해할 수 있는” 경우에 정의됩니다 (현재는 D3D11 만).
UNITY_INITIALIZE_OUTPUT(type,name) * UNITY_INITIALIZE_OUTPUT (type, name) - 지정된 typename 변수를 0으로 초기화합니다.
UNITY_COMPILER_HLSL, UNITY_COMPILER_HLSL2GLSL, UNITY_COMPILER_CG * UNITY_COMPILER_HLSL, UNITY_COMPILER_HLSL2GLSL, UNITY_COMPILER_CG - 쉐이더 컴파일에 사용되는 쉐이더를 지정합니다. 각각의 매크로는 Microsoft의 HLSL(DX9, DX11, XBoxOne, Xbox360, WinRT에서 사용), HLSL에서 GLSL로 변환(iOS/Android 및 OpenGL에서 사용) 및 NVIDIA의 Cg (서피스 쉐이더 분석 및 몇몇 Sony 플랫폼)에 대응하고 있습니다. 컴파일러 특유의 쉐이더 문법에서의 핸들링 차이가 나오는 미묘한 케이스가 발생하여, 각각 다른 코드를 작성하고자 하는 경우에 이를 사용합니다.

그림자 매핑 매크로

그림자 맵의 선언 및 샘플링은 플랫폼에 따라 크게 다를 수 있기 때문에, Unity에는 이를 지원하는 매크로가 다수 있습니다 :

Macro: Use:
UNITY_DECLARE_SHADOWMAP(tex) * UNITY_DECLARE_SHADOWMAP (tex) - “tex”라는 그림자 맵 텍스처 변수를 선언합니다.
UNITY_SAMPLE_SHADOW(tex,uv) * UNITY_SAMPLE_SHADOW (tex, uv) - “tex”라는 그림자 맵 텍스처를 특정 “uv”좌표로 샘플링합니다(XY 컴포넌트는 텍스처 위치, Z 컴포넌트는 상대적인 깊이). 0–1의 범위에서 그림자로 하나의 float 변수를 리턴합니다.
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) * UNITY_SAMPLE_SHADOW_PROJ (tex, uv) - 위와 동일하지만, 투영 그림자 맵 로드를 실행합니다. “uv”는 float4이며 다른 모든 컴포넌트는 조회를 하기 위해 .w로 나눕니다.

상수 버퍼 매크로

Direct3D 11은 모든 쉐이더 변수를 “constant buffer”(상수 버퍼)로 그룹화합니다. Unity 내장 변수의 대부분은 이미 분류되어 있지만, 스스로 만드는 쉐이더 변수는 예상 업데이트 빈도에 따라 다른 constant buffer에 저장하는 것이 가장 좋습니다.

CBUFFER_START (name)CBUFFER_END 매크로를 이 경우에 사용합니다 :

CBUFFER_START(MyRarelyUpdatedVariables)
    float4 _SomeGlobalValue;
CBUFFER_END

Texture / Sampler declaration macros

Usually you would use texture2D in shader code to declare a texture and sampler pair. However on some platforms (such as DX11), textures and samplers are separate objects, and maximum possible sampler count is quite limited. Unity has some macros to declare textures without samplers, and to sample a texture using a sampler from another texture. Use this if you end up running into sampler limits, and you know that several of your textures can in fact share a sampler (sampler defines texture filtering and wrapping modes).

Macro: Use:
UNITY_DECLARE_TEX2D(name) Declares a texture and sampler pair.
UNITY_DECLARE_TEX2D_NOSAMPLER(name) Declares a texture without a sampler.
UNITY_DECLARE_TEX2DARRAY(name) Declares a texture array sampler variable.
UNITY_SAMPLE_TEX2D(name,uv) Sample from a texture and sampler pair, using given texture coordinate.
UNITY_SAMPLE_TEX2D_SAMPLER( name,samplername,uv) Sample from texture (name), using sampler from another texture (samplername).
UNITY_SAMPLE_TEX2DARRAY(name,uv) Sample from a texture array with a float3 UV; the z component of the coordinate is array element index.
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) Sample from a texture array with an explicit mipmap level.

표면 쉐이더 패스 표시기(Surface shader pass indicators)

Surface Shaders가 컴파일될 때, 라이팅을 하기 위해 다양한 패스용으로 대량의 코드를 생성할 수 있습니다. 각각의 패스를 컴파일할 때 다음 중 하나의 매크로가 정의됩니다 :

Macro: Use:
UNITY_PASS_FORWARDBASE * UNITY_PASS_FORWARDBASE - Forward Rendering의 기본 패스(주 지향성 라이트, 라이트 맵, SH)
UNITY_PASS_FORWARDADD * UNITY_PASS_FORWARDADD - Forward Rendering 추가 패스 (패스마다 하나의 라이트)
UNITY_PASS_DEFERRED Deferred shading pass (renders g buffer).
UNITY_PASS_SHADOWCASTER Shadow caster and depth texture rendering pass.
UNITY_PASS_PREPASSBASE Legacy deferred lighting base pass (renders normals and specular exponent).
UNITY_PASS_PREPASSFINAL Legacy deferred lighting final pass (applies lighting and textures).

관련 항목

내장 쉐이더 include 파일
Built-in shader helper functions