本文总结Unity shader的内置宏。基于Unity 2020.3和Built-in管线。
这里的内置宏包括shader内定义宏和平台相关宏。
shader内定义宏是指需要由用户手动定义的宏。Unity内置了下面5种命令,用户可以根据需要在不同pass中自行定义。
这个命令应在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 |
这个命令应在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本身的形状就是就是通过贴图控制的
这个命令应在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 | 未发现 |
这个命令可以在Forward Base Pass和Forwar Add Pass中定义:
宏名 | 开启条件 | 动态物体 | 烘培物体 |
---|---|---|---|
FOG_LINEAR | 雾设置为Linear | Y | Y |
FOG_EXP | 雾设置为Exponential | Y | Y |
FOG_EXP2 | 雾设置为Exponential Squared | Y | Y |
这个命令与GPU Instancing有关,Unity自动的GPU Instancing只在Forward Base Pass启用:
宏名 | 开启条件 | 动态物体 | 烘培物体 |
---|---|---|---|
INSTANCING_ON | 材质开启GPU Instancing | Y | |
PROCEDURAL_INSTANCING_ON | 使用DrawIndirect相关函数渲染 | Y |
定义#pragma target后会启用SHADER_TARGET宏。SHADER_TARGET与#pragma target所定义的数值相匹配,比如定义为3.0时,SHADER_TARGET值将是30。
平台相关宏是指不需要用户手动定义,根据不同配置自动启用的宏。
宏名 | 平台 |
---|---|
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。
UNITY_VERSION包含了Unity版本的数值。比如Unity版本为5.0.1,那么UNITY_VERSION的值就是501。
包括6个阶段
SHADER_STAGE_VERTEX
SHADER_STAGE_FRAGMENT
SHADER_STAGE_DOMAIN
SHADER_STAGE_HULL
SHADER_STAGE_GEOMETRY
SHADER_STAGE_COMPUTE
以下宏由项目设置决定,在shader和C#脚本中均可查看是否启用,C#脚本中由枚举BuiltinShaderDefine定义,可以通过GraphicsSettings.HasShaderDefine接口查询:
宏 | 开启条件 |
---|---|
UNITY_NO_DXT5nm | |
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