我正在使用 Unity 并希望呈现对象的厚度。我首先想到的是使用 ZBuffer 和深度但它总是依赖于相机,它似乎是合法的。
但我想避免改变相机的z位置。目的是使标准化"相机的位置,但我不知道该怎么做。
也许是一个简单的矩阵技巧?
我没有专注于任何正面或背面操作,而只是使用深度来检索或伪造物体的厚度(但不是视图位置取决于保持相机方向效果)
以下是两个可以检索Unity深度的简单着色器。
Unity Vertex和片段着色器
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.depth = o.pos.zw;
return o;
}
half4 frag(v2f i) : COLOR {
#if SHADER_API_FLASH
return EncodeFloatRGBA(i.depth.x/i.depth.y);
#else
return i.depth.x/i.depth.y;
#endif
}
Unity Surface着色器
void vert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);
o.screenPos = ComputeScreenPos(o.pos);
}
void surf(Input IN, inout IceOutput OUT)
{
/* Some code */
float Depth = 1.0 / (_ZBufferParams.x * tex2Dproj(_CameraDepthTexture, IN.screenPos.xyw).r + _ZBufferParams.y);
// Adjust depth manually to math camera distance to the object
half4 edgeBlendFactors = half4(1.0, 0.0, 0.0, 0.0);
edgeBlendFactors = saturate((Depth - IN.screenPos.w + _A) * _B); // _A = 7 and _B = 0.2
Depth = lerp(1.0, 0.0, edgeBlendFactors);
/* Some code */
}
我也找到了那些有趣的文章,但我无法取得同样的结果。