Unity Shader - ShaderLab: SubShader SubShader块

目录: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都会应用该状态

你可能感兴趣的:(Unity,Shader,译文,Unity,ShaderLab,Subshader)