Unity ShaderLab 语法基础一

学习笔记  整理来至《Unity Shader入门精要》 

一个Unity Shader 的基础结构如下;

Shader "Name" {
  Properties {
  //开放到材质面板的属性
  }
  SubShader{
//SubShader可以写多个
  }
  FallBack "Vertexlit"
}

Properties语义支持的属性类型
属性类型 例子 对应CG变量类型
Int                

_Int("Int",Int) = 2

float,half,fixed

Float

_Float("Float",Float) = 4.5

float,half,fixed
Range(min,max)

_Range("Range",Range(1,10)) = 5 

float,half,fixed
Color        

_Color("Color",Color) = (1,1,1,1)

float4,half4,fixed4
Vector

_Vector("Vector",Vertex) = (1,2,3,4)

float4,half4,fixed4
2D

_2D("Texture",2D) = "white"{}

sampler2D
Cube

_Cube("Cube",Cube) = "black"{} 

samplerCube
3D

_3D("3D",3D) = ""{} 

sampler3D

float 高精度类型,32位,通常用于世界坐标下的位置,纹理UV,或涉及复杂函数的标量计算,如三角函数、幂运算等

half  中精度类型,16位,数值范围为[-60000,+60000],通常用于本地坐标下的位置、方向向量、HDR颜色等

fixed 低精度类型,11位,数值范围为[-2,+2],通常用于常规的颜色与贴图,以及低精度间的一些运算变量等

比较常用的一个规则是,除了位置和坐标用float以外,其余的全部用half,颜色用fixed

subshader 语义中包含的定义通常如下:

Subshader{
    //可选的
    [Tags]
  
    //可选的
    [RenderSetup]

    Pass{
    }
    //其他Pass
}
常见的渲染状态设置选项
状态名称 设置指令 解释
Cull Cull Back/Front/Off 设置剔除模式:剔除背面/正面/关闭剔除
ZTest

ZTest Less Greater/LEqual/GEqual/

Equal/NotEqual/Always

设置深度测试时使用的函数
ZWrite       ZWrite On/ Off 开启/关闭深度写入
Blend Blend SrcFactor DstFactor 开启并设置混合模式

在SubShader中设置了上述渲染状态时,将会应用到所有的Pass

subshader 的标签(Tags)的结构如下:

Tags {"TagName1"="Valuel" "TagName2" = "Value2"}
SubShader 的标签类型(Tags)
标签类型 说明 例子
Queue 控制渲染顺序,制定该物体属于哪一个渲染列队,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,我们也可以自定义使用的渲染列队来控制物体的渲染顺序 Tags{"Queue"="Transparent"}
RenderType         对着色器进行分类,列如这是一个不透明的着色器,或是一个透明的着色器等.这可以被用于着色器替换(Shader Replacement)功能         Tags{"RenderType"="Opaque"}
DisableBatching     一些SubShader在使用Unity的批处理功能时会出现问题,列如使用了模型空间下的坐标进行顶点动画,这时可以通过该标签来直接指明是否对该SurShader使用批处理 Tags{"DisableBatching"="True"}
ForceNoShadowCasing 控制使用该SubShader的物体是否会投射阴影 Tags{"ForceNOShadowCasting"="True"}
IgnoreProjector         如果该标签值为"True",那么使用该SubShader的物体将不会受Porjector的影响,通常用于半透明物体. Tags{"IgnoreProjector"= "True"}
CanUseSpriteAtlas 当该SubShader是用于精灵(sprites)时,将该标签设置为"False" Tags{"CanUseSpriteAtlas"="False"}
PreviewType 指明材质面板将如何预览该材质,默认情况下,材质将显示为一个球形,我们可以通过把该标签的值设为"Plane","SkyBox"来改变预览类型 Tags{"PreviewType"="Plane"}

上述标签仅可以在SubShader中声明,不可以在Pass中声明

Pass的标签类型(Tags)
标签类型 说明 例子
LightMode 定义该Pass在Unity的渲染流水线中的角色 Tags{"LightMode"="ForwardBase"}
RequireOptions 用于指定当满足某些条件时才渲染该Pass,他的值是一个由空格分隔的字符串.目前,Unity支持的选项有:SoftVegetation. Tags{"RequireOptions"="SoftVegetation"}

特殊Pass标签:

UsePass:如我们之前提到的一样,可以使用该命令来复用其他Unity Shader中的Pass

GrabPass: 该Pass负责抓取屏幕并将结果存储在一张纹理中,以用于后续的Pass处理

上一篇:C++将十进制整数转换为n进制数输出(用栈)


下一篇:【保存2】