目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Predefined Shader preprocessor macros
版本:2019.1

Predefined Shader preprocessor macros

着色器预处理宏

Unity 编译 shader programs 期间的一些预处理宏。

(本篇的宏介绍随便看看就好,要想深入了解,还是直接看Unity得.cginc代码更好理解,主要看看不是宏介绍的其他内容)

Target platform

目标平台

目标平台
SHADER_API_D3D11 Direct3D 11
SHADER_API_GLCORE 桌面版OpenGL “core” (GL 3/4)
SHADER_API_GLES OpenGL ES 2.0
SHADER_API_GLES3 OpenGL ES 3.0/3.1
SHADER_API_METAL iOS/Mac Metal
SHADER_API_VULKAN Vulkan
SHADER_API_D3D11_9X Universal Windows Platform(UWP平台) Direct3D 11 “feature level 9.x”
SHADER_API_PS4 PlayStation 4.也会定义 SHADER_API_PSSL
SHADER_API_XBOXONE Xbox One

SHADER_API_MOBILE 为常用的移动平台定义(GLES,GLES3,METAL)。

另外,SHADER_TARGET_GLSL 定于在着色器语言为GLSL的平台(对 OpenGL/GLES 平台来说该宏都会定义)。

Shader target model

着色器目标模型

SHADER_TARGET 使用一个数值来定义编译着色器模型(与 #pragma target 指令匹配)。如,当你的编译Shader model 3.0 的着色器,对应 SHADER_TARGET30。你可以使用着色器代码来判断,例如:

#if SHADER_TARGET < 30// 比 shader model 3.0 底的版本// 限制很大的着色器兼容处理
#else// 硬件支持,则可以处理更好的方式
#endif

Unity version

Unity 版本

UNITY_VERSION 包含了Unity版本的数值。例如,UNITY_VERSION501 对应着Unity 5.0.1。着可以用于版本比较,如果你需要在编写shader是需要使用不同unity版本的内置功能。例如,一个 #if UNITY_VERSION >= 500 的预处理检测,仅能在Unity 版本是5.0.0或是更高版本才行。

Shader stage being compiled

着色器编译阶段

预处理宏 SHADER_STAGE_VERTEXSHADER_STAGE_FRAGMENTSHADER_STAGE_DOMAINSHADER_STAGE_HULLSHADER_STAGE_GEOMETRYSHADER_STAGE_COMPUTE 将会在编译每个Shader阶段时被定义。通常将像素着色器和计算着色器共享着色器代码是,会很有用,这样可以处理一个稍微不太一样的情况。

Platform difference helpers

平台差异的辅助

不鼓励直接使用这些平台宏,因为它们并不总是有助于代码的未来验证。例如,如果您正在编写一个用于检查D3D11的着色器,您可能想要确保在将来,该检查将扩展到包含Vulkan。那么我们推荐使用Unity定义了的几个helper宏(在HLSLSupport.cginc中):

使用
UNITY_BRANCH 将其添加到条件语句之前,以告诉编译器应该将其编译成实际的分支。在HLSL平台上该宏会替换为[branch]。
UNITY_FLATTEN 在条件语句之前添加这个语句,告诉编译器应该将其平铺以避免实际的分支指令。在HLSL平台上该宏会替换为[flatten]。
UNITY_NO_SCREENSPACE_SHADOWS 定义在不使用级联屏幕空间阴影贴图(移动平台)的平台上。
UNITY_NO_LINEAR_COLORSPACE 定义在不支持线性颜色空间的平台(移动平台)上。
UNITY_NO_RGBM 定义在不使用RGBM压缩光映射的平台(移动平台)上。
UNITY_NO_DXT5nm 定义在不使用DXT5nm标准映射压缩(移动平台)的平台上。
UNITY_FRAMEBUFFER_FETCH_AVAILABLE 定义在"framebuffer color fetch"功能可用的平台上(通常是iOS平台——OpenGL es2.0、3.0和Metal)。
UNITY_USE_RGBA_FOR_POINT_SHADOWS 定义在平台上,点光源阴影贴图使用RGBA纹理编码的深度(其他平台使用单通道浮点纹理)。
UNITY_ATTEN_CHANNEL 定义包含数据的光衰减纹理通道;用于逐像素照明代码。定义为“r”或“a”。
UNITY_HALF_TEXEL_OFFSET 定义在要半texel偏移调整映射到像素的texel(如Direct3D 9)。
UNITY_UV_STARTS_AT_TOP 总是用值1或0来定义。值为1时,代表在纹理V坐标(纹理顶部)为0。类direct3d平台使用值为1(纹理顶部为0);类opengl平台使用0值(纹理顶部为1)。
UNITY_MIGHT_NOT_HAVE_DEPTH_Texture 定义平台是否可以通过手动将深度呈现到纹理中来模拟阴影映射或深度纹理。
UNITY_PROJ_COORD(a) 给定一个4分量向量,它返回一个适合于投影纹理读取的纹理坐标。在大多数平台上,这将直接返回传入参数的值。
UNITY_NEAR_CLIP_VALUE 定义为近切面的值。direct3d平台使用0.0,opengl平台使用-1.0。
UNITY_VPOS_TYPE 定义像素位置输入(VPOS)所需的数据类型:D3D9上的float2,其他地方的float4。
UNITY_CAN_COMPILE_TESSELLATION 当着色器编译器可用曲面细分着色器HLSL语法(目前只有D3D11)时定义。
UNITY_INITIALIZE_OUTPUT(type,name) 将给定类型的变量名初始化为零。
UNITY_COMPILER_HLSLUNITY_COMPILER_HLSL2GLSLUNITY_COMPILER_CG 指示使用哪个着色器编译器编译着色器——分别是:Microsoft的HLSL、HLSL到GLSL转换器和NVIDIA的Cg。有关更多细节,请参阅有关 shading Languages 的文档。如果您遇到处理编译器之间差异的非常特殊的着色器语法,并且希望为每个编译器编写不同的代码,那么可以使用这种方法。
UNITY_REVERSED_Z 定义在使用反向Z缓冲区的平台。存储的Z值在范围1…0而不是0…1。

Shadow mapping macros

阴影映射宏

定义与采样阴影贴图,在不同平台差别很大。Unity有一些宏可以辅助处理:

使用
UNITY_DECLARE_SHADOWMAP(tex) 声明一个名为“tex”的阴影贴图纹理变量。
UNITY_SAMPLE_SHADOW(tex,uv) 采样阴影贴图纹理“tex”在给定的“uv”坐标下(XY分量为纹理位置,Z分量为纹理深度用于比较)。返回float作为阴影因子0到1范围。
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) 与上面类似,但是可以读取投影阴影映射。“uv”是一个float4,所有其他组件都除以.w进行采样。

注意:不是所有的显卡都支持shaodwmaps。使用 SystemInfo.SupportsRenderTextureFormat 来检测支持与否。

Constant buffer macros

常量缓存宏

Direct3D 11将所有着色器变量分组到"constant buffers"(常量缓冲区)中。多数Unity内置变量都已分类号了,但对于你自己的shader变量,根据更新的预期频率,最理想的还是将它们划分到constant buffers中。

使用 CBUFFER_START(name)CBUFFER_END 宏:

CBUFFER_START(MyRarelyUpdatedVariables)float4 _SomeGlobalValue;
CBUFFER_END

Texture/Sampler declaration macros

纹理/采样器的宏定义

通常你使用 texture2D 在shader代码中成对定义一张纹理和采样器。然而某些平台(如:DX11),纹理和采样器都是对立的对象,且最大可采样器数量是非常有限的。Unity的一些宏定义了纹理,而没定义采样器,而采样一张纹理使用的采样器是来自另一种纹理的采样器。如果您最终遇到了采样器限制,并且您知道您的几个纹理实际上可以共享一个采样器(采样器定义纹理过滤和循环模式),那么可以使用这个功能。

使用
UNITY_DECLARE_TEX2D(name) 声明一个纹理和采样器对。
UNITY_DECLARE_TEX2D_NOSAMPLER(name) 声明一个没有采样器的纹理。
UNITY_DECLARE_TEX2DARRAY(name) 声明一个纹理数组采样器变量。
UNITY_SAMPLE_TEX2D(name,uv) 使用给定的纹理坐标从纹理和采样器对中采样。
UNITY_SAMPLE_TEX2D_SAMPLER(name,samplername,uv) 使用来自另一个纹理的samplername采样器来采样指定name纹理。
UNITY_SAMPLE_TEX2DARRAY(name,uv) 使用float3 UV从纹理数组中提取样本;坐标的z分量是数组元素索引。
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) 直接指定mipmap级别采样纹理数组。

了解更多相关信息,查看文档 Sampler States。

Surface Shader pass indicators

表面着色器pass的指示器

当Surface Shader被编译后,它们将生成许多不同的处理光照的pass代码。当编译每个pass,下面的宏列表中会有其一会变定义:

使用
UNITY_PASS_FORWARDBASE 正向渲染基础的PASS(主方向光,光照贴图,SH(球谐采样))。
UNITY_PASS_FORWARDADD 前向渲染叠加的PASS(每个光源有效时都将执行一次该PASS)。
UNITY_PASS_DEFERRED 延迟着色的PASS(渲染到G BUFFER)。
UNITY_PASS_SHADOWCASTER 阴影投影和深度纹理渲染的PASS。
UNITY_PASS_PREPASSBASE 旧版本的延迟照明的基础PASS(渲染法线和高光指数)。
UNITY_PASS_PREPASSFINAL 旧版本的延迟照明最终调整色调的PASS(应用于灯光和纹理)。

Disable Auto-Upgrade

禁止自动更新

UNITY_SHADER_NO_UPGRADE 允许你禁止Unity自动更新或修改你的shader文件。

See also

另请参阅

  • Built-in Shader include files
  • Built-in Shader variables
  • Vertex and Fragment program examples

Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏相关推荐

  1. Predefined Shader preprocessor macros //预定义的着色器预处理宏

    Predefined Shader preprocessor macros 预定义的着色器预处理宏 Unity defines several preprocessor macros when com ...

  2. Shader学习_曲面细分着色器

    曲面细分 详细介绍 当然除了细分与简化之外,还有另外一种同属一类的操作叫做==曲面规则化(Mesh Regularization)==其所作的便是将三角面都变的尽可能相同,从而也达到提升模型效果的目的 ...

  3. threejs 源码解析_ThreeJS 物理材质shader源码分析(顶点着色器)

    ThreeJS 物理材质shader源码分析(顶点着色器) Threejs将shader代码分为ShaderLib和ShaderChunk两部分,ShaderLib通过组合ShaderChunk的代码 ...

  4. Unity 3D 图形学 Shader之顶点与片段着色器(五)

    通过实现一个只有颜色属性可调节的简单材质效果更好的了解顶点与片段着色器 一.顶点着色器 顶点着色器就是处理顶点的着色器,每个顶点都会执行一次顶点着色器.我们先认识下顶点函数的结构: 顶点着色器函数的名 ...

  5. WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

    HLSL,High Level Shader Language,高级着色器语言,是 Direct3D 着色器模型所必须的语言.WPF 支持 Direct3D 9,也支持使用 HLSL 来编写着色器.你 ...

  6. Unity 5.3中的GGX着色器

    在Unity 5.3的标准着色器中,我们改为使用GGX来实现BRDF,来进行点光源和平行光等光源的光照计算,当然也可以计算基于图像的光照.此外,我们彻底修改了立方体贴图的卷积计算,使其能够以较少的执行 ...

  7. 【无标Unity基于ShaderLab实现光照系统(着色器代码实现小结)

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...

  8. Unity Shader:用几何着色器实现复联3灭霸的终极大招灰飞烟灭

    (图1:正常渲染) (图2:几何着色器粒子化特效进行中) (图3:几何着色器粒子化特效进行中) 1,用几何着色器进行图元转换 在OpenGL渲染管线中,几何着色器Geometry Shader有一个独 ...

  9. 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 amp; 纹理混合...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星 ...

最新文章

  1. CentOS7:Thrift的安装
  2. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置
  3. MATLAB画高斯曲线
  4. 程序物语(六):探寻你的与众不同之处
  5. 【JavaSE04】Java中循环语句for,while,do···while-练习
  6. sqlite3 命令行简易教程
  7. [转载]学习数据库分表和分库思想
  8. 当程序开发人员开始抛弃技术时,是否意味着噩梦的开始?抛弃了SQL Server 2000才发现客户的简单问题真的很难解决...
  9. 一个柱状图里两种数据_分享一些数据分析常用的统计图图表
  10. 专访阿里巴巴量子实验室:最强量子电路模拟器“太章”到底强在哪?
  11. 史上最失败系统!微软正式终止对Vista支持
  12. 学习模式上的记录之统计篇四 关于excel里添加趋势线和回归统计的R square数值不一致的情况
  13. 上海计算机一级选择题库,上海计算机一级选择题
  14. 南方CASS9.0软件资源下载附安装教程
  15. css 实现三个 div 等分排在一行
  16. 如何将LaTeX公式拷贝到Word中
  17. mpc高清设置超详细
  18. Linux 打开文件显示: No such file or directory
  19. 什么是gpo,gpt,gpc(活动目录组策略)
  20. JAVA代码混淆器大全

热门文章

  1. 多传感器融合定位(一)——3D激光里程计
  2. 再造STM32---第二十二部分:CAN—通讯实验
  3. sqlserver快捷键设置
  4. 新考纲 PMP 备考精讲
  5. java号码分身_[算法] 电话号码分身 (小米2017 秋招真题)[JavaScript]
  6. 计算机毕业设计SSM电力公司员工安全培训系统【附源码数据库】
  7. chrome点击书签栏书签_如何充分利用Chrome书签栏
  8. 手机上测试空气质量的软件,PM2.5指数爆表:6款PM2.5手机查询软件实时监测空气质量...
  9. LeetCode算法题整理(200题左右)
  10. FFmpeg修改源码支持H265