标签:Unity3d 深度图 UNITY PROJ pragma 深度 v2f
文章目录
深度图原理
移步:深度测试,这篇文章讲了深度图的概念。
深度重建
深度图是经过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
}
一些遇到的坑
- 深度图 != 深度缓冲,深度图和深度缓存不同,zwrite off可以关闭写入深度缓存,但还会写入深度图。_CameraDepthTexture本身是渲染得到的屏幕纹理,和zwrite并没有直接联系。
标签:Unity3d,深度图,UNITY,PROJ,pragma,深度,v2f 来源: https://blog.csdn.net/qq_37340753/article/details/120592620
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。