目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:ShaderLab: SubShader
版本:2019.1
ShaderLab: SubShader
SubShader块
每个Shader都有subshaders组成。当Unity显示一个网格模型,它将会去查找shader来使用,并拿到第一个可以在用户显卡上运行的subshader来使用。
Syntax
语法
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
可为subshader定义可选tags、公共状态和一组pass定义。
Detail
详情
一个subshader定义了一组rendering passes(渲染用的pass),也可以给所有的pass设置公共的状态。另外,subshader的Tags也可以设置。
当Unity选择一个subshader来渲染用时,它将会为它要渲染的对象处理每个pass定义的内容(多passes一般是为了多光源处理,或是其他的效果)。每个渲染对象都有消耗,你应该尽可能的减少shader的运算量。当然,有些显卡上使用单一个pass实现不聊某些效果;那么这是你就不得不使用多pass来完成了。
每个pass都可以定义为:regular Pass(一般的pass),或是一个Use Pass(引用自其他地方的Pass,可以是本shader文件外或其他shader文件的pass),或是一个 Grab Pass(抓取屏幕内容的pass)。
在Pass内定义的状态也可以放到subshader块内。这样其他所有的pass都可以使用这些功用的数据,属性,状态等。
Example
例子
// ...
SubShader {
Pass {
Lighting Off
SetTexture [_MainTex] {}
}
}
// ...
这个subshader定义了一个Pass,它关闭了所有的灯光,仅用名为_MainTex的纹理来显示网格。
(官方这例子太不像话,明明上面说的是功用状态嘛,这个例子又没体现,所以下面另加一个例子)
SubShader {
tags { "RenderType"="Opaque" }
fog { mode off } // 这样两个pass都会应用该状态
// main color
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
// mask color
Pass {
ztest greater zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_mask
ENDCG
}
}
Fallback "Diffuse"
主要看fog {mode off}这句,两个pass都会应用该状态