微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unity3d深度图

文章目录

深度图原理

移步:深度测试,这篇文章讲了深度图的概念。

深度重建

深度图是经过NDC坐标空间后渲染出来的,深度存储时不是线性的,因此需要进行重建。幸运的是,Unity3D shaderlab中提供了这个函数接口。

// vert
o.vertex = UnityObjectToClipPos(v.vertex);	// mvp变换
o.screenPos = ComputeScreenPos(o.vertex);	// 获取屏幕空间坐标
COmpuTE_EYEDEPTH(o.screenPos.z);			// 获取模型在View空间的z

// frag
float screenZ = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));
float depth = Linear01Depth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));

深度写入

注意:RenderQueue <= 2450

Pass {
    Name "ShadowCaster"
    Tags { "lightmode" = "ShadowCaster" }

    ZWrite On ZTest LEqual Cull Off

    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma target 2.0
    #pragma multi_compile_shadowcaster
    #include "UnityCG.cginc"

    struct v2f {
        V2F_SHADOW_CASTER;
        UNITY_VERTEX_OUTPUT_STEREO
    };

    v2f vert(appdata_base v)
    {
        v2f o;
        UNITY_SETUP_INSTANCE_ID(v);
        UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
        TRANSFER_SHADOW_CASTER_norMALOFFSET(o)
        return o;
    }

    float4 frag(v2f i) : SV_Target
    {
        SHADOW_CASTER_FRAGMENT(i)
    }
    ENDCG
}

一些遇到的坑

  1. 深度图 != 深度缓冲,深度图和深度缓存不同,zwrite off可以关闭写入深度缓存,但还会写入深度图。_CameraDepthTexture本身是渲染得到的屏幕纹理,和zwrite并没有直接联系

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐