unity shader中关于Tags的整理
在我们写unity shader的时候经常会遇到要定义一些shader tags的时候,但是又不能知道到底要设置哪些状态,有哪些状态可以设置,每次都要去网上搜索,感觉很麻烦,因此特地整理了一下,以便以后需要用的时候查阅。
Unity shaderLab 中的Tags一起包括2类:
- ShaderLab: SubShader Tags
- ShaderLab: Pass Tags
- Own tags
一个是定义在subshade中的Tags 一个是定义在Pass中的Tags,以及可以使用自定义的Tags, 下面分别对这几种Tags进行说明。
Tags的定义形式:
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
ShaderLab: SubShader Tags
1.Rendering Order - Queue tag
unity为了解决渲染顺序的问题,提供了渲染队列,unity内部使用整数索引表示每个渲染队列,索引越小越先渲染
名称 | 队列索引号 | 描述 |
---|---|---|
Background
|
1000 | 最先渲染,通常绘制作为背景的物体,如天空盒 |
Geometry
|
2000 | 默认的队列,大部分不透明的物体使用这个队列 |
AlphaTest
|
2450 | 需要Alpha Test的物体使用此队列,单独处理是因为处理完不透明物体后进行alpha测试更高效 |
Transparent
|
3000 |
这个渲染队列是在Geometry 和AlphaTest之后按从后往前的顺序渲染的。任何alpha混合(即着色器不写入深度缓冲)应该在这里(玻璃,粒子特效等)。
|
Overlay
|
4000 | 这个渲染队列用于一些叠加效果。最后渲染的东西应该在这里(比如镜头光斑,后处理)。 |
使用示例:
Shader "Transparent Queue Example"
{SubShader{Tags { "Queue" = "Transparent" }Pass{// rest of the shader body...}}
}
如果需要渲染的物体在这些队列之间,可以使用:
Tags { "Queue" = "Geometry+1" }
2.RenderType tag
RenderType标签将着色器分类为若干预定义组,例如是一个不透明的着色器,或alpha测试的着色器等。被用于着色器替换,或者在某些情况下用于生成相机的深度纹理。
所有Unity 内置的着色器,都设置了一个RenderType类型,便于渲染时的着色器替换。
内置的RenderType类型有:
类型 | 描述 |
Opaque | 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。 |
Transparent | 用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。 |
TransparentCutout | 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。 |
Background | 天空盒着色器。 |
Overlay | 光晕着色器、闪光着色器。 |
TreeOpaque | 地形引擎中的树皮。 |
TreeTransparentCutout | 地形引擎中的树叶。 |
TreeBillboard | 地形引擎中的广告牌树。 |
Grass | 地形引擎中的草。 |
GrassBillboard | 地形引擎何中的广告牌草。 |
3.DisableBatching tag
一些着色器(主要是对象空间顶点变形的着色器)在使用绘制调用批处理时不起作用——这是因为批处理将所有几何图形转换为世界空间,因此“对象空间”丢失了。可以使用DisableBatching标记来表明这一点。
Value | 描述 |
“True” | 对于使用此属性的shader 总是不合批 |
“False” | 默认值,总是合批 |
“LODFading” | 当LOD衰减激活时,不合批; 大多用于树 |
4.ForceNoShadowCasting tag
如果给定了ForceNoShadowCasting标签,并且该标签的值为“True”,那么使用该子着色器呈现的对象将永远不会投射阴影。这是非常有用的,当你对透明对象使用着色器替换的时候,如果想要这个物体不需要产生阴影,就用这个。半透明物体渲染如果不需要阴影就加上标签。
5.IgnoreProjector tag
如果IgnoreProjector 标签是给定的,并且有一个“True”的值,那么使用这个着色器的对象将不会受到投影的影响。这在半透明物体上很有用,因为没有好的方法让投影影响它们。这个特性往往那个用在GUI上。程序默认“IgnoreProjector”=“Flase”。
6.CanUseSpriteAtlas tag
如果着色器用于精灵,当它们放到atlases时,将CanUseSpriteAtlas标签设置为“False”,就无法使用了)。
7.PreviewType tag
PreviewType指示材质检查器预览应该如何显示材质。默认情况下,材质显示为球体,但PreviewType也可以设置为“Plane”(将显示为2D)或“Skybox” 将显示为skybox)。
ShaderLab: Pass Tags
1.LightMode tag
光照的渲染路径,如果我们需要跟光源打交道,我们需要为每个pass制定它使用的渲染路径,这样shader 的光照计算才能被正常执行。
标签 | 描述 |
Always | 不管使用哪种渲染路径总是被渲染 |
ForwardBase | 用于向前渲染,该pass会计算环境光,平行光, 逐顶点/SH光源和lightmaps |
ForwardAdd | 用于向前渲染,该pass会计算额外的逐像素光源,每个pass对应一个光源 |
Deferred | 用于延迟渲染,改pass会渲染G-buff |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理或者一张深度纹理中 |
MotionVectors | 通常计算每个物体的运动向量 |
PrepassBase | 用于遗留的延迟光照,渲染法线和高光反射的指数部分。 |
PrepassFinal | 用于遗留的延迟光照,通过合并纹理,光照,自发光得到最后的颜色 |
Vertex | 用于遗留的顶点光照渲染,当对象没有光照映射时;所有顶点光照都被应用。 |
VertexLMRGBM | 用于遗留的顶点光照渲染,当对象被光照映射时;在lightmap编码为RGBM (PC && console)的平台上。 |
VertexLM | 用于遗留的顶点光照渲染,对象被光照映射时;在lightmap是double-LDR编码的平台(mobile )上。 |
当指定了shader 的这些标签以后,我们可以在project Setting -> player -> Other Setting -> rendering Path中指定项目所需要的渲染路径,也可以在camera选中该camera需要的渲染路径。
2.PassFlags tag
pass可以指定渲染管线是怎么样传递数据给它的,这是通过使用PassFlags标记完成的,它的值是用空格分隔的标志名称。目前支持的标志是:
OnlyDirectional:当在ForwardBase pass类型中使用时,这个标志使得只有主方向光和环境光探测数据被传递到着色器中。这意味着不重要的光的数据不被传递到顶点光或球面谐波着色器变量。
3.RequireOptions tag
一个pass可以表明它只应该在满足一些外部条件时才被渲染。这是通过使用RequireOptions标记完成的,它的值是一个由空格分隔的选项组成的字符串。目前Unity支持的选项有:
SoftVegetation:只有在高质量窗口中打开SoftVegetation时才渲染这个pass。
Own tags
除了unity内置的tags以外,我们可以定义自己的tags,并且使用Meterial.GetTag() function 查询它们.
函数声明:
public string GetTag(string tag, bool searchFallbacks);public string GetTag(string tag, bool searchFallbacks, string defaultValue);
- 如果材质的shader没有定义名为tag的标签,则返回defaultValue
- 如果
searchFallbacks
为 true,将会查询查询该shader下所有的subshaders 跟 fallbacks,如果为false,则只查询当前使用的subshader,
使用GetTag而不通过回退进行搜索,这使得检测当前使用的子着色器成为可能:为每个子着色器添加一个具有不同值的自定义标记,并在运行时查询该值。例如,Unity water使用这个功能来检测着色器何时回到非反射模式,并在这种情况下关闭反射相机。
using UnityEngine;public class Example : MonoBehaviour
{// Attach this to a gameObject that has a renderer.string materialTag = "RenderType";void Start(){Renderer rend = GetComponent<Renderer>();string result = rend.material.GetTag(materialTag, true, "Nothing");if (result == "Nothing"){Debug.LogError(materialTag + " not found in " + rend.material.shader.name);}else{Debug.Log("Tag found!, its value: " + result);}}
}
参考:
https://docs.unity3d.com/Manual/SL-SubShaderTags.html
https://docs.unity3d.com/Manual/SL-PassTags.html
unity shader中关于Tags的整理相关推荐
- unity shader中 CG和GLSL之间矩阵存储方式的差异
在unity shader中计算切线空间光照的时候发现TBN矩阵在计算后并没有转置,这和在GLSL.线代中的计算方法相差一个转置的步骤,因为在GLSL中直接求得的TBN矩阵是切线空间到世界空间的变换, ...
- Unity Shader中各部分定义内容详解
Unity Shader中各部分定义内容详解 样板 Shader "Practice/Unlit/SimpleUnlit" {Properties{_MainTex (" ...
- qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式
参考文章: 使用采样器状态 - Unity 手册docs.unity3d.comhttps://blog.csdn.net/chenjinxian_3D/article/details/518169 ...
- Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型
我们是如何看到这个世界的 从宏观上来说,渲染包含了两大部分 决定一个像素的可见性 决定这个像素上的关照计算 而光照模型就是用于决定一个像素上进行怎样的光照计算 通常来讲,我们要模拟真实的光照环境来生成 ...
- 【Unity大气渲染】Unity Shader中实现大气散射(半成品)
写在前面 这是之前在做天空盒的时候同步写的分析博客,结果后面写到一半就忘了继续了,这里先贴出当时写的半成品,有小伙伴问我怎么做的,这里只能尽力把之前的半成品先放出来了(写得很乱,勿怪orz),,后面有 ...
- Unity Shader中内置的坐标空间与转换矩阵函数
模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系. 世界空间(world space)也称全局空间(glob ...
- unity shader中一些常用函数总结
参考网址:http://www.manew.com/forum.php?mod=viewthread&tid=97247&extra=page%3D2%26filter%3Dtypei ...
- Unity Shader笔记之 Unity的光源类型
Unity一共支持4种光源类型:平行光.点光源.聚光灯和面光源 (area light) . 面光源仅在烘焙时才可发挥作用. 光源类型有什么影响 最常使用的光源属性有光源的位置 .方向 (更具体说就是 ...
- unity shader入门精要_Unity Shader 入门(一):渲染流水线
一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门紧要学习 candycat1992/Unity_Shaders_Bookgithub.com 1.2 还有一些图形学的历史 ...
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...
最新文章
- LeetCode简单题之二叉搜索树的最小绝对差/最小距离
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.
- .gitkeep是什么? .gitignore和.gitkeep之间的区别(译)
- IE5下通过、不会被列表框遮挡的日期控件
- 【转】dicom通讯的工作方式及dicom标准简介!!
- zabbix监控磁盘io
- java编程xml_XML Java编程
- Excel的python读写
- java -jar vm参数_java相关:运行jar程序时添加vm参数的方法
- mysql自增主键批量_Mysql批量插入随机数据改进版_设置表主键为自增,免得主键冲突...
- 【noip2013】d2解题报告
- 学生社团管理系统PHP源码,学生社团管理系统 附带源码
- 响应面法 matlab,怎么用MATLAB编写响应面优化的程序?
- 米家扫地机器人 设置不停止_【小米 米家 扫地机器人使用总结】设置|清扫_摘要频道_什么值得买...
- 柏拉图《会饮篇》阅读笔记
- nao机器人刷机记录
- EduSoho开源网校系统源码(附安装教程、下载安装包),支持开源免费下载
- CentOS操作系统安装BT宝塔面板
- 计算机专业在线杂志,计算机类的cscd期刊汇总
- python实现一个简单的计时器
热门文章
- wget 下载网站所有文件
- 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机
- 再看iOS如何使用SM2/SM3/SM4/SM9 方法二:使用http://gmssl.org这个开源密码箱来实现从编译到使用
- laas和saas_什么是IaaS,PaaS和SaaS及其区别
- aspcms基本的安全策略
- 《关于长沙.NET技术社区未来发展规划》问卷调查结果公布
- 服务器 异常自动关机,服务器自动关机常见问题
- GUI学习之二十二——QRubberBand学习总结
- 关系代数笛卡尔积和自然连接的例子
- Mysql主从切换自动_keepalived实现对mysql主从复制的主备自动切换