我正在尝试构建一个无限雾着色器。此雾应用于3D平面
目前我有Z-Depth Fog。我遇到了一些问题。
正如您在屏幕截图中看到的,有两种观点
绿色是我的3D平面。问题出在红线上。这条线似乎取决于我的相机并不好,因为当我旋转相机时,线条会受到相机位置和旋转的影响。
我不知道它来自何处,以及如何根据相机位置设置雾限。
着色
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _FogColor;
uniform sampler2D _CameraDepthTexture;
float _Depth;
float _DepthScale;
struct v2f {
float4 pos : SV_POSITION;
float4 projection : TEXCOORD0;
float4 screenPosition : TEXCOORD1;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
// o.projection = ComputeGrabScreenPos(o.pos);
float4 position = o.pos;
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
float4 p = position * 0.5f;
p.xy = float2(p.x, p.y * scale) + p.w;
p.zw = position.zw;
o.projection = p;
// o.screenPosition = ComputeScreenPos(o.pos);
position = o.pos;
float4 q = position * 0.5f;
#if defined(UNITY_HALF_TEXEL_OFFSET)
q.xy = float2(q.x, q.y * _ProjectionParams.x) + q.w * _ScreenParams.zw;
#else
q.xy = float2(q.x, q.y * _ProjectionParams.x) + q.w;
#endif
#if defined(SHADER_API_FLASH)
q.xy *= unity_NPOTScale.xy;
#endif
q.zw = position.zw;
q.zw = 1.0f;
o.screenPosition = q;
return o;
}
sampler2D _GrabTexture;
float4 frag(v2f IN) : COLOR {
float3 uv = UNITY_PROJ_COORD(IN.projection);
float depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, uv));
depth = LinearEyeDepth(depth);
return saturate((depth - IN.screenPosition.w + _Depth) * _DepthScale);
}
ENDCG
}
接下来我想旋转我的雾来进行Y-Depth Fog,但我不知道如何达到这个效果。
答案 0 :(得分:1)
我看到了两种方法来实现你想要的东西:
是根据平面深度和物体深度的差异渲染平面深度,计算雾度,如果obj深度较小则为0,(objDepth - planeDepth)*如果较大则为比例)< / p>
不是渲染到纹理而是在着色器中计算到平面的距离而是直接使用它。
我不确定你做了什么,因为我对Unity表面着色器不是很熟悉,但是从代码中得到了一些不同的结果。
答案 1 :(得分:0)
这似乎是由_CameraDepthTexture引起的,这就是使用相机位置计算深度的原因。
但我不知道如何纠正它......似乎没有办法从另一点获得深度。有什么想法吗?
这是另一个例子。绿色你可以“看到”物体,蓝线对我来说应该是雾。