着色器 - 对象深度或厚度

时间:2014-10-08 12:15:51

标签: unity3d directx glsl rendering shader

我正在使用 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 */
}

我也找到了那些有趣的文章,但我无法取得同样的结果。

0 个答案:

没有答案