ShaderLap语法

ShaderLab语法简介:
在Unity引擎中,为了方便用户与引擎沟通,Unity引擎创造了一种简单的命令集词法结构。这些命令是我们与渲染引擎沟通的桥梁,我们可以通过这些命令控制渲染引擎的工作;


一、ShaderLab语法框架:


Shader "着色器的类集合/着色器的名字"
{
// 着色器的内部结构
Properties // 属性列表
{
}
// 每个着色器必须拥有至少一个子着色器
SubShader // 第一个子着色器
{
Tags{ "表示名"="标识的值" } // 当前子着色器的队列排队标识和渲染的级别
// 命令集合
Command list
// 着色器可编程执行代码,可以有也可以没有,在使用Cg/HLSL/GLSL语言或者固定着色的时候必须存在,其他的可以没有
Pass
{
}
}


SubShader// 第二个子着色器
{
}


SubShader // 第N子着色器
{
}
}


1、Shader关键字后面跟随的是着色器的名称和级别(菜单);
注意:每个着色器当中必须有一个子着色器,子着色器没有名字,如果你想指定名称,必须在子着色器中使用 Name命令来指定,其实没有意义;


每个着色器当前只会执行一个子着色器,这个子着色器表示在当前环境下可以被正常的渲染。Unity引擎只要发现一个可以执行子着色器他就会放弃其他的子着色器。


如果没有一个子着色器能正常工作的他就会执行Fallback命令里的备用着色器。如果没有Fallback那么他就会放弃渲染;




2、SubShader中的Pass执行过程:
Pass语法块,实际是用来做最终渲染的代码位置。他在子着色器中,除了表面着色器不需要以外其他都需要Pass过程;


3、Properties 属性列表:
属性列表可以在 “检视体视图框”中显示可以修改的属性,我们也可以用C#代码控制此类属性,达到用代码向着色器传递数据的方法;


Properties中语法的定义格式:变量名 ("在检视体面板中现实的标题", 变量的属性)=变量初始化值


属性类型:
Vector : 表示当前属性是一个4维向量;
Color : 表示当前属性是一个颜色表达值(RGBA)
Float : 表示当前变量是一个单精度浮点数;
Range(minValue, maxValue): 表示当前属性是一个在minValue和maxValue之间的单精度浮点值
2D:表示支持一个2D纹理贴图;
Rect: 表示支持一个矩形纹理贴图;
Cube: 表示支持一个立方体纹理贴图;




二、ShaderLab命令与语法:


1、Color : Color(R, G, B, A)/[属性变量]


解释:他是通知引擎让当前的物体显示一种你指定的纯色


2、Lighting : Lighting on/off


解释:通知引擎当前渲染对象是否支持灯光的渲染,如果你是自发光物体,请你一定要关闭灯光,如果你开启了灯光就需要使用材质块的命令对物体进行渲染,否则他的渲染会失效;


3、Material : Material { // 材质块的颜色级别设定 }


解释:材质块主要是用来和Lighting on配合使用的,当灯光开启的时候我们固定渲染器就必须执行材质块中的颜色设定内容。材质块颜色设定级别有以下几种:
(1)Diffuse(R, G, B, A)/[颜色属性变量] : 表示你让当前物体支持漫反射显示,漫反射是所有灯光颜色的基础;
(2)Specular(R, G, B, A)/[颜色属性变量]: 表示你让当前物体支持高光色彩显示,他是在漫反射的基础上追加高光颜色;
(3)Shininess value/[常态的浮点值] : 这是高光的光泽度,用来控制高光的显示耀斑的大小,他必须和高光色彩同时出现;
(4)Emission(R, G, B, A)/[颜色属性变量]:表示当前物体有自发光颜色,他不会被任何的漫反射光照影响;
(5)Ambient(R, G, B, A)/[颜色属性变量]: 表示环境光对当前物体的颜色影响,只要有自发光,那他就废了!


这里,自发光色彩的显示级别最高,他可以覆盖漫反射颜色,融合高光颜色。


对于材质块最终的色彩公式:
Ambient * Render Setting菜单的环境光颜色 + ( LightColor  * Diffuse + LightColor * Specular ) + Emission


 4、SetTexture : SetTexture[纹理属性变量]{[命令选项]}


命令选项:
combine: 将两个颜色混合,混合的源可以是上一次内容(previous),也可以是一个常态的颜色值
constant: (常量颜色值)、primary(顶点颜色值)、texture(纹理的颜色)其中的一种;


constantColor:表示用来设定一个常量颜色值与纹理混合;
matrix: 用来从外界获取一个矩阵,让这个模型产生扭曲变换;


对于SetTexture命令常用的方法:
(1)直接使用纹理中的颜色: SetTexture[_MainTex]{ combine texture }
(2)让纹理颜色和常量纯色进行混合: SetTexture[_MainTex]{ constantColor[_Color] combine constant * texture }
(3)我们希望顶点颜色和纹理颜色进行混合: SetTexture[_MainTex]{ combine primary * texture }
(4)我们希望顶点颜色和常量同时影响纹理: SetTexture[_MainTex]{ constantColor[_Color] combine constant * texture * primary }


5、Cull: Cull front/back/off
裁减渲染命令,将不需要显示的部分我们可以将其剪除:
front: 表示将顺时针渲染的面裁减掉;
back:表示将逆时针旋转的面裁减掉;
off:正反两面都不裁减;


6、标签栏:
标签栏的写法 : Tags{ "标签"="标签值" }, 用来决定以下代码适用于什么样渲染环境下执行;


(1)SubShader的标签栏
子着色器标签栏是用来标示当前子着色器的渲染顺序,渲染的方式,和一些渲染需要的特性。这个标签栏可以决定当前渲染代码是否被执行;


渲染顺序:"Queue"标签,他的值有以下几种
"BackGround": 表示背景级别的渲染,例如天空盒他的默认值 1000;
"Geometry": 表示几何体级别的渲染,例如任意的3D物体。值为 2000;
"AlphaTest": 如果进行Alpha通道测试的物体我就绘制在这一层,值为2450;
"Transparent": 表示透明物体的绘制,例如带有镂空效果的绘制我们都要放在这层,不论3D还是2D, 值为 3000
"Overlay": 表示镜头特效处理层,镜头的特殊效果处理都可以在这里进行,值 4000


用户可以自定义的调整系统给定的值,我们可以这样写例如:Tags{ "Queue"="Gemoetry+10" }
通过这样的自定义,我们可以提前某些指定物体的绘制顺序。


渲染类型设定: "RenderType"标签,他有以下几种值来决定他的渲染方式
"Opaque": 表示当前子着色器渲染支持实体(没有透明部分)的物体绘制;
"Transparent": 表示当前子着色器支持带有透明效果绘制;
"BackGround": 表示当前的绘制是天空盒代码绘制;
"Overlay": 表示当前子着色器中的绘制都是镜头特效处理的绘制;


例如我们想绘制2D的带有透明通道的绘制我们会写成这样: Tags{ "Queue"="Transparent" "RenderType"="Transparent" }


其他的一些设定:
如果我们想忽略透视矩阵 "IgnoreProjector"="true", 这样表示他对带有透视效果的摄像机不感冒;
如果我们希望使用精灵贴图 "CanUseSpriteAtlas"="true",这样表示我们对精灵切图比较欢迎


(2)Pass过程的标签栏
 Pass的标签栏主要是用来描述当前过程对渲染路径的支持(Camera组件中Render Path属性);
渲染路径:
  1、Vertex Lit: 顶点光照渲染,光照的计算都是在顶上完成的,没有实现到每个像素上。这样做的好处是渲染效率很高,但是会出现硬块阴影,亮面和暗面非常不自然;
  2、Forward:前置灯光渲染,也称为顺序光照渲染,它支持像素级别的光照计算(允许像素参与光照计算),优点是亮面和暗面过渡自然,不会出现硬连接。但是效率远不如Vertex Lit模式。
  3、Deferred:延迟光照,它可以还原阴影,并且支持像素光照渲染,光源数量再多都不会影响性能。优点:真实感表示更强,缺点:拥有大量的阴影计算。
  
   对每个Pass过程我们都可以通过Tags来设定当前过程支持的光照路径计算;


我们使用Tags中的“LightMode”标签来设定渲染路径:
 “Vertex” : 表示只支持顶点光照;
“ ForwardBase”:表示支持顶点和顺序光照;
“ForwardAdd“:表示当前光照支持多光源渲染; 


7、深度缓冲


什么是深度:
深度其实就是该像素点在3D世界中距离摄像机的距离,深度值(Z轴的值)越大,表示物体离摄像机越远;


什么是深度缓冲:
深度缓冲指的是用来记录每个像素点的深度值,如果我们启用了深度缓冲,在绘制每个像素点之前,3D引擎都会把他的深度值和已经存在的像素深度值进行比较,如果新像素点的深度值 <(小于) 已存在的像素的深度值,则新像素点就替代原来的像素。反之,新像素点就会被旧像素点遮蔽。最终屏幕上显示的就是深度缓冲中对应的像素点的颜色;


什么是深度缓冲测试:
新像素的深度值和旧像素的深度值进行比较的一种过程,一般都是3D API函数自己执行。


为什么要进行深度测试:
深度测试一般是为了表示3D空间中物体与物体之间的遮挡关系,在2D中我们需要关闭深度缓冲利用绘制顺序来进行覆盖;


在我们的ShaderLab语法中,我们使用ZTest和ZWrite来控制深度测试和深度缓冲的开关;


在Unity引擎中ZTest和ZWrite都是默认打开的,如果你希望绘制的是2D内容,那么请你关闭深度缓冲,别关闭深度测试;


8、AlphaTest Aplha通道测试命令:


Alpha通道测试是发生在图像最终输出到屏幕上的时候进行的最后的步骤;


启动测试的关键字 AlphaTest;
格式: AlphaTest off // 表示关闭掉通道测试
格式: AlphaTest comparsion AlphaValue // 表示让引擎绘制的时候忽略掉一定范围的值


comparsion:比较运算符:
大于: Greater
小于: Less
等于: Equal
大于等于 : GEqual
小于等于: LEqual


说明用途:AlphaTest是用来忽略掉指定范围的像素对象,但他不能对颜色的还原有直接帮助,如果想让他按照自己的需求正常还原,我们需要借助颜色混合命令,AlphaTest做不到;


9、颜色混合命令Blend:


当图像被渲染的时候,所有着色器执行之后,所有贴图被按照颜色自己的需求显示在屏幕上,Blend命令可以通过一系列的计算将限定的颜色值表达出来;


格式:Blend SrcFactor DstFactor
我们启动混合功能后,产生的颜色被乘以 SrcFactor的值,已经存在屏幕上的颜色乘以 DstFactor,并且将两者叠加在一起


公式:source color * SrcFactor + dest color * DstFactor


SrcFactor和DstFactor分别可以取以下值:
One
表示值为1,使用此设置表示让所有的颜色全部通过;
Zero
表示值为0,使用此设置表示让源或目标的颜色全部被删除
SrcColor
表示使用源颜色的值来作为混合运算值
DstColor
表示使用目标颜色值来作为混合运算值
SrcAlpha
表示使用源像素的Alpha通道值与颜色混合计算
DstAlpha
表示使用目标像素的Alpha通道值与颜色混合计算
OneMinusSrcColor
表示使用一个公式( 1 - source color),对于源颜色的反相取值
OneMinusSrcAlpha
表示使用一个公式( 1 - source alpha),对于源颜色alpha通道的值反相取值
OneMinusDstColor
表示使用一个公式( 1 - dest color),对于目标颜色的反相取值
OneMinusDstAlpha
表示使用一个公式( 1 - dest alpha),对于目标颜色alpha通道的值反相取值


常用模式:


SrcAlpha OneMinusSrcAlpha 表示标准的混合显示,该透的透,不该透明就正常显示
One One 表示添加剂,让颜色饱和度达到最大;
One OneMinusDstColor 软性添加剂,表示根据背景的颜色深度,如果背景深度越大,前景颜色就越鲜亮;
DstColor Zero 与后面的背景进行融合;
DstColor SrcColor 表示让后面的背景颜色的融合度更深;
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值