簡介
本文總結Unity shader的內置宏。基於Unity 2020.3和Built-in管線。
這里的內置宏包括shader內定義宏和平台相關宏。
一、shader內定義宏
shader內定義宏是指需要由用戶手動定義的宏。Unity內置了下面5種命令,用戶可以根據需要在不同pass中自行定義。
- multi_compile_fwdbase
- multi_compile_fwdadd
- multi_compile_fwdadd_fullshadows
- multi_compile_fog
- multi_compile_instancing
下面逐個介紹
1.multi_compile_fwdbase
這個命令應在Forward Base Pass中定義,定義后會引入built-in管線中Forward Base Pass所需要的宏:
宏名 | 開啟條件 | 動態物體 | 烘培物體 |
---|---|---|---|
DIRECTIONAL | 無 | Y | Y |
LIGHTPROBE_SH | 無 | Y | |
LIGHTMAP_ON | 場景烘培過 | Y | |
DIRLIGHTMAP_COMBINED | 烘培開啟方向圖時 | Y | |
DYNAMICLIGHTMAP_ON | 開啟Realtime Lighting | Y | |
SHADOWS_SHADOWMASK | 烘培模式為Shadowmask | Y | |
LIGHTMAP_SHADOW_MIXING | 烘培模式為Subtractive | Y | Y |
SHADOWS_SCREEN | 主方向光投影 | Y | Y |
VERTEXLIGHT_ON | 光源數量超過Pixel Light Count | Y |
2.multi_compile_fwdbase
這個命令應在Forward Add Pass中定義,定義后會引入built-in管線中與光源類型相關的宏:
宏名 | 開啟條件 | 動態物體 | 烘培物體 |
---|---|---|---|
POINT | 點光源 | Y | Y |
DIRECTIONAL | 方向光 | Y | Y |
SPOT | 聚光燈 | Y | Y |
POINT_COOKIE | 點光源帶COOKIE | Y | Y |
DIRECTIONAL_COOKIE | 方向光帶COOKIE | Y | Y |
注1:這里的COOKIE是指燈光是否設置了Cookie屬性 | |||
注2:為什么SPOT沒有對應的Cookie相關宏,因為SPOT本身的形狀就是就是通過貼圖控制的 |
3.multi_compile_fwdadd_fullshadows
這個命令應在Forward Add Pass中定義,定義后會引入built-in管線中與光源類型相關的宏以及陰影相關宏:
宏名 | 開啟條件 | 動態物體 | 烘培物體 |
---|---|---|---|
POINT | 點光源 | Y | Y |
DIRECTIONAL | 方向光 | Y | Y |
SPOT | 聚光燈 | Y | Y |
POINT_COOKIE | 點光源帶COOKIE | Y | Y |
DIRECTIONAL_COOKIE | 方向光帶COOKIE | Y | Y |
SHADOWS_DEPTH | 聚光燈或方向光帶陰影 | Y | Y |
SHADOWS_CUBE | 點光源帶陰影 | Y | Y |
SHADOWS_SOFT | 開啟軟陰影 | Y | Y |
SHADOWS_SHADOWMASK | 未發現 | ||
LIGHTMAP_SHADOW_MIXING | 未發現 | ||
SHADOWS_SCREEN | 未發現 |
4.multi_compile_fog
這個命令可以在Forward Base Pass和Forwar Add Pass中定義:
宏名 | 開啟條件 | 動態物體 | 烘培物體 |
---|---|---|---|
FOG_LINEAR | 霧設置為Linear | Y | Y |
FOG_EXP | 霧設置為Exponential | Y | Y |
FOG_EXP2 | 霧設置為Exponential Squared | Y | Y |
5.multi_compile_instancing
這個命令與GPU Instancing有關,Unity自動的GPU Instancing只在Forward Base Pass啟用:
宏名 | 開啟條件 | 動態物體 | 烘培物體 |
---|---|---|---|
INSTANCING_ON | 材質開啟GPU Instancing | Y | |
PROCEDURAL_INSTANCING_ON | 使用DrawIndirect相關函數渲染 | Y |
6.shader目標模型
定義#pragma target后會啟用SHADER_TARGET宏。SHADER_TARGET與#pragma target所定義的數值相匹配,比如定義為3.0時,SHADER_TARGET值將是30。
二、平台相關宏
平台相關宏是指不需要用戶手動定義,根據不同配置自動啟用的宏。
1.渲染平台相關
宏名 | 平台 |
---|---|
SHADER_API_D3D11 | Direct3D 11 |
SHADER_API_GLCORE | 桌面OpenGL |
SHADER_API_GLES | OpenGL ES 2 |
SHADER_API_GLES3 | OpenGL ES 3 |
SHADER_API_METAL | iOS/Mac Metal |
SHADER_API_VULKAN | Vulkan |
SHADER_API_D3D11_9X | |
SHADER_API_PS4 | PlayStation 4 |
SHADER_API_XBOXONE | Xbox One |
另外,在使用GLSL的平台上會開啟SHADER_TARGET_GLSL。 |
2.Unity版本宏
UNITY_VERSION包含了Unity版本的數值。比如Unity版本為5.0.1,那么UNITY_VERSION的值就是501。
3.着色器階段宏
包括6個階段
SHADER_STAGE_VERTEX
SHADER_STAGE_FRAGMENT
SHADER_STAGE_DOMAIN
SHADER_STAGE_HULL
SHADER_STAGE_GEOMETRY
SHADER_STAGE_COMPUTE
4.平台差異相關宏
以下宏由項目設置決定,在shader和C#腳本中均可查看是否啟用,C#腳本中由枚舉BuiltinShaderDefine定義,可以通過GraphicsSettings.HasShaderDefine接口查詢:
宏 | 開啟條件 |
---|---|
UNITY_NO_DXT5nm | Player Setting中Normal Map Encoding設置為XYZ |
UNITY_NO_RGBM | |
UNITY_USE_NATIVE_HDR | |
UNITY_ENABLE_REFLECTION_BUFFERS | |
UNITY_FRAMEBUFFER_FETCH_AVAILABLE | 平台支持Framebuffer |
UNITY_ENABLE_NATIVE_SHADOW_LOOKUPS | |
UNITY_METAL_SHADOWS_USE_POINT_FILTERING | |
UNITY_NO_CUBEMAP_ARRAY | |
UNITY_NO_SCREENSPACE_SHADOWS | |
UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS | |
UNITY_PBS_USE_BRDF1 | Tier Settings里將Standard Shader Quality設置為High |
UNITY_PBS_USE_BRDF2 | Tier Settings里將Standard Shader Quality設置為Medium |
UNITY_PBS_USE_BRDF3 | Tier Settings里將Standard Shader Quality設置為Low |
UNITY_NO_FULL_STANDARD_SHADER | |
UNITY_SPECCUBE_BOX_PROJECTION | Tier Settings里勾選Reflection Probes Box Projection |
UNITY_SPECCUBE_BLENDING | Tier Settings里勾選Reflection Probes Blending,用於多個Reflection Probe的融合 |
UNITY_ENABLE_DETAIL_NORMALMAP | Tier Settings里勾選Detail Normal Map |
SHADER_API_MOBILE | 移動平台 |
SHADER_API_DESKTOP | 桌面平台 |
UNITY_HARDWARE_TIER1 | Tier1 |
UNITY_HARDWARE_TIER2 | Tier2 |
UNITY_HARDWARE_TIER3 | Tier3 |
UNITY_COLORSPACE_GAMMA | 色彩空間為Gamma空間 |
UNITY_LIGHT_PROBE_PROXY_VOLUME | Tier Settings里勾選Enable Light Probe Proxy Volume |
UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS | |
UNITY_LIGHTMAP_DLDR_ENCODING | Player Setting里的Lightmap Encoding設置為Low Quality |
UNITY_LIGHTMAP_RGBM_ENCODING | Player Setting里的Lightmap Encoding設置為Medium Quality |
UNITY_LIGHTMAP_FULL_HDR | Player Setting里的Lightmap Encoding設置為High Quality |
UNITY_VIRTUAL_TEXTURING | |
UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION | |
UNITY_ASTC_NORMALMAP_ENCODING | |
SHADER_API_GLES30 | |
UNITY_UNIFIED_SHADER_PRECISION_MODEL |
注:某些宏的查詢並不准,如:UNITY_FRAMEBUFFER_FETCH_AVAILABLE
注2:Normal Map的DXT5nm是指法線圖中只保存XY通道,Z值通過XY計算
三、SRP
雖然本文章是基於Build-in管線,但並不與SRP、URP等沖突。URP只是不再使用multi_compile_fwdbase、multi_compile_fwdadd和multi_compile_fwdadd_fullshadows這幾個宏,而是轉由自己手動定義。可能是因為URP中使用的宏與Build-in差距較大,所以改為手動定義。不過基本的Lightmap機制並沒有改變,幾個基本的Lightmap宏的用法與Build-in管線還是一樣的。
參考資料:
[1]: https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html
[2]: https://docs.unity3d.com/Manual/SL-BuiltinMacros.html
[3]: https://docs.unity3d.com/ScriptReference/Rendering.BuiltinShaderDefine.html