【Unity Shader】---准确认识SubShader语义块结构、渲染状态设定、Tags标签
一【SubShader】
每个UnityShader文件可以包含多个SubShader语义块,但至少要有一个。当Unity需要加载这个UnityShader时,
Unity会扫描所有的SubShader语义块,然后选择一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity
就会使用FallBack语义指定的UnityShader。
Unity提供这种语义的原因在于,不同的显卡具有不同的能力。例如,一些旧的显卡仅能支持一定数目的操作指令,
而一些高级的显卡可以支持更多的指令数,那么我希望在旧的显卡上使用计算复杂度较低的着色器,而在高级的显卡上
执行计算复杂度高的着色器,以便提供更出色的画面效果。
SubShader
{
//可选的
[Tags]
//可选的
[RenderSetup]
Pass
{
}
//或更多Pass
}
SubShader中定义了一系列的Pass以及可选的标签[Tags]、状态[RenderSetup]。每个Pass定义一次完整的渲染流程
但是如果Pass数目过多会造成渲染性能的下降。因此,我们尽量使用数量最小的Pass。
补充说明:[Tags][RenderSetup]也可以在Pass中声明。不同的是,SubShader中的一些标签设置是特定的。也就是说,
这些标签和Pass中设置的标签是不一样的。而对于状态设置来说,其使用的语法是相同。不过在SubShader进行的设置
将会用于所用的Pass。
二【渲染状态】
ShaderLab提供了一系列渲染状态的设定,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。
状态名称 设置指令 解释
Cull Cull Back|Front|Off 设置剔除模式,剔除背面|正面|关闭剔除 默认CullBack
ZTest ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always 设置深度时使用的函数 默认ZTest LEqual 小于或等于目标深度才能被渲染
ZWrite ZWrite On|Off 开启和关闭深度写入 默认ZWrite On
Blend Blend SrcFactor DstFactor 开启并设置混合模式
当在SubShader块中设置了上述状态,将会被应用于所有的Pass。如果不想这样(例如在双面渲染中,我们可以希望第一
个Pass剔除正面来对背面进行渲染,在第二个Pass中选择剔除背面来对正面进行渲染),可以在Pass内部来单独设置状态。
三【Tags标签】
UnityShader的Tags是一个键值对(Key/Value Pair),他的键和值都是字符串类型。这些键值是对SubShader和渲染引擎
之前沟通的桥梁。他们用于告诉渲染引擎:怎么样和什么时候调用这个SubShader。
标签语法如下:Tags{"TagName1" = "Value1" "TagName2" = "Value2"}
SubShader标签类型:注意这些标签只能在SubShader中声明,不能再Pass中
标签类型 说明 列 子
Queue 控制渲染顺序,指定该物体属于哪一个渲染队列 Tags{"Queue" = "Transparent"}
RenderType 对着色器分类。例如:这是一个不透明着色器 Tags{"RenderType" = "Opaque"}
DisableBatching 一些SubShader在使用Unity批处理时会出现问题。
可以用该标签直接表明是否使用批处理 Tags{"DisableBatching" = "True"}
ForecNoShadowCasting 控制该SubShader的物体是否会投射阴影 Tags{"ForceNoShadowCasting" = "True"}
IgnoreProjector 设置该SubShader的物体是否受Projector影响 Tags{"IgnoreProjector" = "True"}
True常用与半透明物体。
CanUseSpriteAtlas 当该SubShader用于“sprite”时,将该标签设为False Tags{"CanUseSpriteAtlas" = "False"}
PriviewType 材质面板的预览类型,一般默认材质预览效果是球形 Tags{"PreviewType" = "Plane"}
还可以该为"Plane" "SkyBox"。
四【Pass语义块】
Pass
{
[Name]
[Tags]
[RenderSetup]
//other code
}
1、[Name]Pass名称
Pass的名称,可以使用ShaderLab的UsePass命令来使用其他Shader的Pass代码
例如:UsePass"MyShader/MYPASSNAME",这样提高代码复用性,
注意:UnityShader内部会自动把PassName转换成大写格式。
2、[RenderSetup]Pass渲染状态设置
SubShader的渲染状态也适用于Pass,而且Pass还可以适用固定管线着色器的命令
3、[Tags]Pass的标签
Pass的标签不同于SubShader标签,这些标签用于告诉渲染引擎我们希望如何来渲染物体
标签类型 说明 例子
LightModel 定义该Pass在渲染管线中的角色 Tags{"LightModel"="ForwardBase"}
RequireOption 用于指定满足某些条件是才渲染该 Pass Tags{"RequireOption" = "SoftVegetation"}
ColorMask 可以让我们制定渲染结果的输出通道,而不是通常情况下的RGBA这4个通道全部写入。可选参数是 RGBA 的任意组合以及 0, 这将意味着不会写入到任何通道。
【Unity Shader】---准确认识SubShader语义块结构、渲染状态设定、Tags标签的更多相关文章
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader入门精要读书笔记(二)UnityShader概述
第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...
- 第四章 开始Unity Shader学习之旅(1)
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- unity shader序列帧动画代码,顺便吐槽一下unity shader系统
一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...
- 小强学渲染之Unity Shader编程HelloWorld
第一个简单的顶点vert/片元frag着色器 1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...
- [Unity Shader] 常用的数值类型和语义
书看到第八章,跟随写了一些例子,但有些数值类型的使用还是需要特别注意,经常需要查阅,在这里做一下总结. 1 ShaderLab属性类型和Cg变量类型的匹配关系 Color.Vector:float4, ...
- 小强学渲染之Unity Shader噪声应用
之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...
随机推荐
- debian利用snmp监控服务器异常状态
1.安装snmp apt-get install snmp snmpd 2.配置snmp vi /etc/snmp/snmpd.conf 注释15行 #agentAddress udp:127.0.0 ...
- FPGA 物理时序不合理的体现(体现方式:数字钟的行扫描和列扫描)
本人在这只讨论建模好的模块来比较解释现象,如有不周到请大家指正. 软件功能仿真和在硬件上的区别:可以从这个数码管的行扫描和列扫描实例来体会一下,物理时序的影响和改进方法. 数码管的行扫描.列扫描要求同 ...
- 023-OpenStack 创建实例类型临时磁盘的讲解
临时磁盘占用的那块磁盘的空间查看 [root@linux-node1 dev]# fdisk -l 磁盘 /dev/sdb:26.8 GB, 26843545600 字节,52428800 个扇区 U ...
- ocvate常用函数
1.生成矩阵相关 https://www.coursera.org/learn/machine-learning/lecture/9fHfl/basic-operations 1. 初始化矩阵 a = ...
- 10年前文章_ vi编辑器查找与替换方法
vi编辑器查找与替换方法1.查找:/ 当前行往下找:? 当前行往上找找到后继续查找同方向 n反方向 N2.替换格式: range s/source/target/g解释:range表示要搜索的范围 & ...
- 如何判断系统是32位还是64位的linux系统
如何判断系统是32位还是64位的linux系统 某日,需要下载个安装包,忽然忘记了自己的系统是32位还是64位的系统了,一时想不起来怎么查看时32位还是64位,呵呵,随便百度下,就发现有好多方法,这里 ...
- Day_04-数组,元组,列表
# for i in range(5): # for j in range(5): # print(i,j) # import re # def rm(): # a = ' 1 2 3 4 5 ' # ...
- Element ui 中的Upload用法
效果图: 代码:
- asp.net 怎么上传文件夹啊,不传压缩包
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- tarjan相关模板
感性理解: o(* ̄︶ ̄*)o ^_^ \(^o^)/~ 1. 当根节点有大于两个儿子时,割掉它,剩下的点必然不联通(有两个强连通分量),则他为割点. 那么对于非根节点,在无向图G中,刚且仅当点u存 ...