Unity3D - Shader - 双面渲染的透明效果

默认情况下渲染引擎提出了背面(相对于摄像机的方向)的渲染图元,这样导致即使我们开启了透明(AlphaTest或者Alpha Blend)也无法看到背面的透明效果。

若想要得到双面渲染效果,可以使用Cull指令来控制需要剔除的那个面。

Cull Back | Front | Off

若设置成Back,那么背对摄像机的面就不会被渲染。
若设置成Front,那么朝向摄像机的面就不会被渲染。
若设置成Off,就会关闭剔除功能,但是需要渲染的图元数目会成倍的增加。

透明度测试的双面渲染

可以直接关闭剔除效果来达到双面渲染的目的:

Pass {
     // 定义该Pass在Unity中的光照流水线中的角色
     Tags { "LightMode"="ForwardBase" }

     // 可以使用Cull指令来控制需要剔除n哪个面的渲染图元
     // Cull Back | Front | Off
     // 若设置成Back,那么背对摄像机的面就不会被渲染
     // 若设置成Front,那么朝向摄像机的面就不会被渲染
     // 若设置成Off,就会关闭剔除功能,但是需要渲染的图元数目会成倍的增加
     Cull Off
}

透明度混合的双面渲染

透明度混合需要关闭深度写入,而深入写入被关闭则是“一切混乱的开端”。可以通过两个Pass来解决,一个剔除前面,一个剔除背面,两者结合来达到保证正确深度渲染的关系(Unity会保证顺序执行SubShader中的各个Pass)。

Shader "Unity Shaders Book/Chapter 8/Alpha Blend Both Sided" {
    Properties {
        _Color ("Main Tint", Color) = (1,1,1,1)
        _MainTex ("Main Tex", 2D) = "white" {}
        // 用于在透明纹理的基础上控制整体的透明度
        _AlphaScale ("Alpha Scale", Range(0,1 )) = 1
    }
    SubShader {

        // RenderType标签可以让Unity
        // 把这个Shader归入到提前定义的组(Transparent)
        // 用于指明该Shader是一个使用了透明度混合的Shader

        // IgnoreProjector=True这意味着该Shader
        // 不会受到投影器(Projectors)的影响

        // 为了使用透明度混合的Shader一般都应该在SubShader
        // 中设置这三个标签

        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

        Pass {

            // 向前渲染路径的方式
            Tags {"LightMode"="ForwardBase"}

            Cull Front

            // 深度写入设置为关闭状态
            ZWrite Off

            // 这是混合模式
            Blend SrcAlpha OneMinusSrcAlpha

            ....
        }

        Pass {

            // 向前渲染路径的方式
            Tags {"LightMode"="ForwardBase"}

            Cull Back

            // 深度写入设置为关闭状态
            ZWrite Off

            // 这是混合模式
            Blend SrcAlpha OneMinusSrcAlpha

            ....
        }

    }
    FallBack "Transparent/VertexLit"
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值