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
浙公网安备 33010602011771号