2

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

显然,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 进行模糊。

景深问题。 抠图与自定义 Alpha 着色器。

任何帮助深表感谢。提前致谢。

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

4

1 回答 1

1

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

ZWrite Off

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

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

于 2014-02-24T13:11:21.990 回答