Unity shader之RenderType的应用


Unity Shader 中的 RenderType 是一个重要的标签属性,它定义了该着色器所对应的渲染类型。通过在 Shader 的 SubShader 块内使用 Tags 关键字来声明 RenderType,开发者可以指示Unity引擎如何对待和处理使用该着色器的物体。以下是 RenderType 的主要作用及其影响:

1. 渲染顺序管理

RenderType 决定了物体在渲染管线中的排序。Unity会按照一定的规则对具有不同 RenderType 的物体进行排序,确保正确执行深度测试和混合。例如,通常情况下,不透明物体(Opaque)会在透明物体(Transparent)之前渲染,以保证透明物体能够正确地与已绘制的不透明背景进行混合。

2. 透明度处理

根据 RenderType,Unity会选择相应的透明度混合模式和深度写入策略。例如:

  • Opaque 着色器通常不会进行透明度混合,且会写入深度缓冲,适合用于完全不透明的物体。
  • Transparent 着色器会进行透明度混合,并根据混合模式(如Alpha Blending)与已绘制像素混合,通常不会写入深度缓冲,适用于半透明或全透明物体。
  • TransparentCutout 类似于透明着色器,但仅对具有剪切阈值(cut-off threshold,通常由纹理的Alpha通道控制)的部分进行混合,其余部分被视为不透明。这种类型常用于植被、玻璃窗格等带有透明孔洞的物体。

3. 后处理影响

某些后处理效果可能会根据 RenderType 来决定是否以及如何应用到物体上。例如,某些抗锯齿技术可能仅针对 Opaque 物体进行,而对 Transparent 物体采用不同的处理方式。

4. 性能优化

识别物体的 RenderType 有助于引擎进行性能优化。例如,Unity可以批量处理相同 RenderType 的物体,减少状态切换开销;或者根据 RenderType 选择性地禁用某些光照计算,如对不透明物体关闭背面剔除(Backface Culling)。

5. 渲染替换与定制

RenderType 也支持在运行时动态替换整个场景或部分场景的着色器。通过 Camera.SetReplacementShader 方法,开发人员可以指定一个特定的着色器来替代所有具有指定 RenderType 的物体。这一特性在实现特殊渲染效果(如夜视模式、X光透视等)时非常有用。

6. 引擎内部逻辑

对于某些特定的 RenderType,Unity引擎内部可能存在特定的处理逻辑。例如,Background 类型用于天空盒着色器,引擎会确保其正确地绘制在场景的最远深度;Overlay 类型则用于GUI元素、光晕、闪光等需要叠加在所有其他渲染内容之上的效果。

结论

Unity Shader 中的 RenderType 标签是一个关键的配置项,它直接影响着物体的渲染顺序、透明度处理、后处理应用、性能优化以及引擎内部逻辑。正确设置 RenderType 能确保物体以预期的方式与其他物体、光照和后处理效果交互,并有助于优化整体渲染性能。在编写或修改Shader时,开发者应根据物体的实际视觉特性和渲染需求来选择合适的 RenderType

以下是一些Unity Shader中RenderType应用的具体实例:

实例1:不透明材质(RenderType=Opaque)

Shader "Custom/OpaqueMaterial" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }

        LOD 200

        CGPROGRAM
        // ... 具体的着色器代码 ...
        ENDCG
    }
    FallBack "Diffuse"
}

在这个例子中,我们创建了一个自定义的不透明材质着色器。通过在 SubShader 块内的 Tags 中声明 RenderType="Opaque",告知Unity此着色器应用于不透明物体。引擎将按照正确的顺序先渲染此类物体,并使用深度测试和写入深度缓冲。这对于那些没有透明度或需要深度信息(如遮挡关系)的实体模型,如建筑、硬表面道具、角色的非透明服装等,是非常适用的。

实例2:透明材质(RenderType=Transparent)

Shader "Custom/TransparentMaterial" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Alpha ("Transparency", Range(0,1)) = 0.9
    }
    SubShader {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }

        LOD 200

        CGPROGRAM
        // ... 具体的着色器代码 ...
        ENDCG

        Blend SrcAlpha OneMinusSrcAlpha // 指定透明混合模式
    }
    FallBack "Transparent/Diffuse"
}

这个实例展示了一个透明材质着色器,其 RenderType 设置为 "Transparent"。这类着色器适用于树叶、玻璃、半透明窗帘等需要实现透明效果的物体。由于设置了透明渲染类型,Unity会将其放置在渲染队列的透明阶段,并使用指定的混合模式(如 Blend SrcAlpha OneMinusSrcAlpha 表示标准Alpha混合)进行绘制。此外,透明物体通常不会写入深度缓冲,以允许后面的透明物体正确地与前面已经绘制的像素混合。

实例3:透明裁剪材质(RenderType=TransparentCutout)

Shader "Custom/TransparentCutoutMaterial" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" }

        LOD 200

        CGPROGRAM
        // ... 具体的着色器代码 ...
        ENDCG

        AlphaTest Greater [_Cutoff] // 指定Alpha裁剪阈值
    }
    FallBack "Transparent/Cutout/Standard"
}

最后,这是一个透明裁剪(Alpha Test)材质的示例。RenderType="TransparentCutout" 表明该着色器用于具有透明孔洞或边缘透明、内部不透明的物体,如带孔的树叶、栅栏、窗户格等。在这种情况下,Unity会根据指定的Alpha裁剪阈值 _Cutoff 来决定哪些像素应该被绘制(Alpha值大于阈值的像素),哪些应该被剔除。这类物体通常按照“Alpha Test”队列进行渲染,位于不透明物体之后、全透明物体之前,既能利用深度测试提高效率,又能实现特定的透明效果。

这些实例展示了如何根据实际应用场景选择和设置RenderType,以确保Unity正确地处理材质的渲染行为,实现预期的视觉效果并优化性能。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值