ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Unity shader的内置宏与变体(一)

2021-08-29 21:31:06  阅读:661  来源: 互联网

标签:SHADOWS multi 内置 定义 SHADER UNITY shader Unity API


简介

本文总结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
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

标签:SHADOWS,multi,内置,定义,SHADER,UNITY,shader,Unity,API
来源: https://www.cnblogs.com/vkensou/p/15203708.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有