Unity Shader Tag

本文解析了Unity Shader中SubShader的RenderType标签的作用及其使用方法,通过具体实例介绍了如何利用RenderType实现着色器的动态替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学unity shader,学到SubShader的Tag的时候尤其是对于RenderType很模糊,网上文章看了半天也没有一个具体的解释,于是自己仔细阅读官方文档后,算是明白了些,所以写出来为一些还不明白的shader初学者作为参考


Subshaders使用标签来告诉unity何时去渲染,tag有好几种,最常见的有俩种”Queue”和”RenderType”;


“Queue”:渲染顺序队列

物体的渲染是有顺序的,如果没有顺序,那结果可想而知,而Queue可以让我们去控制你想渲染的物体的渲染顺序而与物体距离相机的远近无关,unity有一组默认的渲染顺序队列

  • Background(1000)
  • Geometry(2000)
  • AlphaTest(2450)
  • Transparent(3000)
  • Overlay(4000)

括号里的是对应的int索引,值越大越靠后被渲染,因为是int值,所以我们可以这样去使用

 SubShader
    {
        Tags { "Queue"="Background+10"  }
        //...
    }

它的意义就是在背景被渲染完后,Geometry前被渲染,这样的方式是会经常用到的,关于“Queue”网上的一些文章其实说的很详细了,而我想重点说的是”RenderType”

“RenderType”:RenderType标签将着色器分类为几个预定义的组,可以动态去替换相同RenderType值的着色器

看到这句话肯定会懵,没关系,我们往下看

有些时候,我们为了达到某种效果需要使用不同的着色器,unity为我们提供了两个接口:

 Camera.RenderWithShader(Shader shader,string replacementTag );
 Camera.SetReplacementShader((Shader shader,string replacementTag );
void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

我这里直接把官方文档当中的代码拿过来方便说明,我们可以在代码中去使用这两个接口,第一个参数指明了被用于替换的shader,第二个参数就是我们的RenderType,下面我们再把官方的shader拿上来

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

这个流程就是,函数先判断如果第二个参数为空,则拿EffectShader去替换所有场景中的物体的着色器,如果不为空,EffectShader找不到则不渲染,EffectShader存在但是RenderType的值找不到也不渲染。所以,如果场景中的物体的着色器的SubShader 的tag的RenderType值为”Opaque”就会被EffectShader的第一个SubShader 替换掉,以此类推。


到这里大致就了解了RenderType,当然,如有其它见解欢迎提出!

### UnityShader 的 Fallback 使用方法 在 Unity 中,`Fallback` 是一种用于处理复杂着色器无法运行的情况下的机制。当设备不支持当前定义的着色器时,可以通过 `Fallback` 关键字指定另一个更简单的着色器作为替代方案[^1]。 #### 基本语法 以下是 `Fallback` 的基本用法: ```csharp Shader "Custom/MyShader" { Properties { ... } SubShader { Pass { ... } } Fallback "Diffuse" // 如果前面的子着色器不可用,则回退到 Diffuse 着色器 } ``` 在这个例子中,如果硬件或图形 API 不支持 `SubShader` 部分的内容,Unity 将自动切换到内置的 `Diffuse` 着色器[^2]。 #### 自定义 Fallback 除了使用内置着色器外,还可以通过自定义方式实现 fallback 功能。例如: ```csharp Shader "Custom/FancyShader" { Properties { ... } SubShader { Tags { "RenderType"="Opaque" } LOD 300 CGPROGRAM ... ENDCG } SubShader { Tags { "RenderType"="Opaque" } LOD 100 CGPROGRAM ... ENDCG } Fallback "VertexLit" // 当所有子着色器都失败时,回退到 VertexLit } ``` 在此示例中,第一个 `SubShader` 提供高细节效果 (LOD 300),而第二个提供较低质量的效果 (LOD 100)。如果两者都不被支持,则会进一步回退至 `VertexLit` 内置着色器。 #### 解决常见问题 1. **性能优化**: 对于低端设备,建议设置多个不同级别的 `SubShader` 并合理配置其 `LOD` 属性。 2. **兼容性测试**: 在开发过程中应针对目标平台进行全面测试,确保 fallback 能够正常工作并满足最低画质需求。 3. **错误排查**: 若发现某些平台上未应用预期中的 shader 效果,请检查是否遗漏了必要的标签 (`Tags`) 或依赖项。 ```csharp // 示例:带 Tag 和 LOD 设置的简单 Shader 定义 Shader "Custom/SimpleShaderWithFallback" { Properties { _Color ("Main Color", Color) = (1,1,1,1) } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 200 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off Fog { Mode Off } Pass {} } Fallback "Transparent/Diffuse" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值