双面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"

来自:https://blog.csdn.net/biezhihua/article/details/79141356

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值