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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值