Unity shader的內置宏與變體(一)


簡介

本文總結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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM