欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

双面shader

程序员文章站 2022-06-10 21:13:25
...

默认情况下渲染引擎提出了背面(相对于摄像机的方向)的渲染图元,这样导致即使我们开启了透明(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

相关标签: Unity shader