Unity 3D - 具有alpha破坏景深的着色器

时间:2013-04-15 15:14:07

标签: unity3d shader

我有一个场景,我真的需要景深。

显然,Unity的景深不适用于处理alpha的任何着色器,无论是内置还是自定义。

所以这会发生,例如,使用透明/漫反射着色器。透明/剪裁可以改为工作。

这是我制作的最简单的自定义着色器,可以触发此行为:

Shader "Custom/SimpleAlpha" {
    Properties {
        _MainTex ("Base (RGBA)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }
        //Tags { "RenderType"="Opaque" }
        LOD 300

        ZWrite Off

        CGPROGRAM
        #pragma surface surf Lambert alpha
        #include "UnityCG.cginc"

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

如果您尝试项目中的代码,您会注意到穿着的每个对象都会以相同的数量模糊,而不是基于Z模糊。

Depth of field problem. Cutout vs custom alpha shader.

非常感谢任何帮助。 提前谢谢。

我在Unity Answers上发布了同样的问题:http://answers.unity3d.com/questions/438556/my-shader-brakes-depth-of-field.html

1 个答案:

答案 0 :(得分:1)

由于景深是使用存储在Z缓冲区中的值的后处理效果,因此以下行是罪魁祸首:

ZWrite Off

对于透明对象,通常禁用Z缓冲区写入,因为透明渲染队列不需要Z缓冲区。

因此,如果删除该行,您应该会看到正确应用于透明对象的景深。但是,位于完全透明区域后面的物体现在将使用错误的Z值模糊。作为快速修复,您可以尝试使用像AlphaTest Greater 0.1这样的alpha测试。