赞
踩
UnityShader指的是一个ShaderLab文件——硬盘上以.shader作为文件后缀的文件
UnityShader是Unity为开发者 提供的高级层的渲染抽象层
ShaderLab是unity提供一门专门为UnityShader服务的语言,所有的UnityShader都是用ShaderLab编写
用语义描述UnityShader的文件结构,语义有Properties(属性),Subshader,Fallback
(1)传统shader只能编写特定类型的shader,例如顶点着色器和片段着色器只能独立写在一份文件中,UnityShader可以在一个文件里写顶点着色器和片段着色器。
(2)传统shader无法在shader(顶点着色器,片段着色器)中设置一些渲染设置,例如是否开启混合,深度测试,模板测试等,需要在另外的代码中自行设置,UnityShader可以在shader里通过一行特定的指令设置。
(3)传统shader需要编写代码设置着色器的输入和输出,处理输入输出的位置对应关系等,UnityShader在特定语句块中声明一些属性,就可以依靠材质改变属性,提供直接访问模型自带数据(如顶点位置,纹理坐标,法线等)的方法。
(4)UnityShader的高度封装性,限制shader类型和语法。
(1)创建一个材质 Material
(2)创建一个UnityShader,并把该shader赋给上面的材质
(3)把材质赋给渲染的对象
(4)在材质面板中调整UnityShader的属性
伪代码: Shader "Unlit/001" { Properties { //各种属性 } SubShader { //标签可选 key = value Tags { //各种标签 } //状态可选 RenderSetup { //各种状态 } Pass { //CG语言写的顶点,片段着色器 CGPROGRAM #pragma vertex vert //顶点着色器名字定义 #pragma fragment frag //片段着色器名字定义 //顶点着色器实现 v2f vert (appdata v) { } //片段着色器实现 fixed4 frag (v2f i) : SV_Target { } ENDCG } Fallback }
解析:
名字:
Shader “Unlit/001” ,001是shader名字,Unlit是材质面板的下拉列表
属性:(CG代码直接使用属性值进行计算,通过调整材质面板的属性值来实现效果)
Properties
{
Name(“displayName”,PropertyType) = DefaultValue
Name(“displayName”,PropertyType) = DefaultValue
//更多属性
}
Name是属性名,在着色器中使用
displayName是显示的名称,材质面板上出现的名字
PropertyType是类型
DefaultValue是默认值
常用类型如下:
_Int (“Int”,Int) = 2 //整数
_Float (“Float”,float) = 2.0 //小数
_Range (“Range”,range(0.0,2.0)) = 1.5 //随机数
_Color (“Color”,Color) = (1,1,1,1) //颜色
_Vector(“Vector”,Vector) = (1,1,2,3) //向量
_MainTex (“Texture”, 2D) = “内置的纹理名称(white,black,gray,bump)” {纹理属性} //2D纹理
_Cube (“Cube”,Cube) = “”{} //天空盒
_3D (“3D”,3D) = “”{} //3D纹理
SubShader:
可以多个SubShader,但至少要一个
Tag(标签)和RenderSetup(状态)可选,多个Pass会造成渲染性能下降,因为调用一次Pass就 产生一次DrawCall。Tag和RenderSetup可以在SubShader里Pass外定义,也可以在Pass内定义,如果在Pass内定义,则只用于该Pass,如果在SubShader里Pass外定义,则应用全部Pass,如果定义重复,则使用SubShader里Pass外定义。
Tag(标签):一个键值对,怎样渲染
“Queue” = “Transparent” //渲染顺序
“RenderType”=“Opaque” //渲染类型 着色器替换功能
“DisableBatching” = “True”//是否进行合批
“ForceNoShadowCasting” = “True”//是否投射阴影
“IgnoreProjector” = “True”//受不受Projector的影响,通常用于透明物体
“CanUseSpriteAtlas” =“Flase”//是否用于图片的shader,通常用于UI
“PreviewType” = “Plane”//用于shader面板的预览类型
RenderSetup(状态):渲染状态的设置指令
剔除模式:
(1) CullBack //剔除背面
(2) CullFront //剔除正面
(3) CullOff //关闭剔除
设置深度测试使用的函数:
(1)ZTest Less Greater //小于
(2)ZTest LEqual //小于等于
(3)ZTest GEqual //大于等于
(4)ZTest Equal //等于
(5)ZTest NotEqual //不等于
(6)ZTest Always //总是
开启/关闭深度写入
(1)ZWrite On //开启
(2)ZWrite Off //关闭
开启并设置混合模式
Blend Src(源) Dst(目标)
Pass:
Pass{
Name “MyShader” //Pass的名字,用于UsePass使用别的shader的Pass,但名字必须大写
Tag
RenderSetup
}
Fallback:如果全部SubShader没有一个显卡能跑,则调用。
表面着色器(Surface Shader):Unity封装多种顶点着色器和片段着色器,只需传参调用,渲染代价比较大
自己编写着色器,比较灵活
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。