我有一个场景,我真的需要景深。
显然,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模糊。
非常感谢任何帮助。 提前谢谢。
我在Unity Answers上发布了同样的问题:http://answers.unity3d.com/questions/438556/my-shader-brakes-depth-of-field.html
答案 0 :(得分:1)
由于景深是使用存储在Z缓冲区中的值的后处理效果,因此以下行是罪魁祸首:
ZWrite Off
对于透明对象,通常禁用Z缓冲区写入,因为透明渲染队列不需要Z缓冲区。
因此,如果删除该行,您应该会看到正确应用于透明对象的景深。但是,位于完全透明区域后面的物体现在将使用错误的Z值模糊。作为快速修复,您可以尝试使用像AlphaTest Greater 0.1
这样的alpha测试。