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

posted @ 2021-08-29 21:30  桃源武陵人  阅读(2679)  评论(0编辑  收藏  举报