日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D 深度图

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D 深度图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度圖

  • 深度圖原理
    • 深度重建
    • 深度寫入
    • 一些遇到的坑

深度圖原理

移步:深度測試,這篇文章講了深度圖的概念。

深度重建

深度圖是經過NDC坐標空間后渲染出來的,深度存儲時不是線性的,因此需要進行重建。幸運的是,Unity3D ShaderLab中提供了這個函數接口。

// vert o.vertex = UnityObjectToClipPos(v.vertex); // mvp變換 o.screenPos = ComputeScreenPos(o.vertex); // 獲取屏幕空間坐標 o.uv = v.uv; // uv COMPUTE_EYEDEPTH(o.screenPos.z); // 獲取模型在View空間的z// frag float depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)); // 線性深度值 float screenZ = LinearEyeDepth(depth); // View空間下的深度值 float depth01 = Linear01Depth(depth); // 歸一到0-1的深度值 // 頂點重建 float4 H = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, depth01 * 2 - 1, 1); // dnc 坐標系下的 x y z float4 D = mul(_CurrentInverseVP, H); // 重建世界坐標點 float4 W = D / D.w; // 透視逆變換, 需要將xyz/w進行歸一

深度寫入

注意:RenderQueue <= 2450。

Pass {Name "ShadowCaster"Tags { "LightMode" = "ShadowCaster" }ZWrite On ZTest LEqual Cull OffCGPROGRAM#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 }

一些遇到的坑

  • 深度圖 != 深度緩沖,深度圖和深度緩存不同,zwrite off可以關閉寫入深度緩存,但還會寫入深度圖。_CameraDepthTexture本身是渲染得到的屏幕紋理,和zwrite并沒有直接聯系
  • 總結

    以上是生活随笔為你收集整理的Unity3D 深度图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。