(Camera-DepthNormaITexture.shader) 获取深度纹理代码: 获取深度+法线纹理: 在Shader中可以直接访问深度纹理_CameraDepthTexture,为了处理平台差异,Unity提供一个统一的宏对深度纹理进行采样 SAMPLE_DEPTH_TEXTURE(大多数情况下可以直接使用tex2D函数进行采样)。其中 i.uv 是当前像素的纹理
简单来说在Unity中,Camera可以生成depth,depth+normals,motion vector三种texture。这些texture在可以帮助我们实现一些很牛的效果,而其中的depth texture就是我们要的深度图。 我们可以通过设置Camera的depthTextureMode属性来使Camera生成对应的texture,例如下面代码可以使Camera生成depth texture(开启后会造成一定的性能消耗):...
Shader"DepthTexture/DepthTextureTest"{CGINCLUDE#include"UnityCG.cginc"sampler2D _CameraDepthTexture;fixed4frag_depth(v2f_img i):SV_Target{float depthTextureValue=SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv);//float linear01EyeDepth = LinearEyeDepth(depthTextureValue) * _ProjectionParams.w;float li...
SAMPLE_DEPTH_TEXTURE 内部使用 tex2D 进行采样,类似的宏还有 SAMPLE_DEPTH_TEXTURE_PROJ、SAMPLE_DEPTH_TEXTURE_LOD,它们在 HLSLSupport.cgin 文件中有定义,如下: #defineSAMPLE_DEPTH_TEXTURE(sampler, uv) (tex2D(sampler, uv).r)#defineSAMPLE_DEPTH_TEXTURE_PROJ(sampler, uv) (tex2Dproj(sampler, ...
4.2 从 _CameraDepthTexture 中获取深度 如果生成了深度纹理,深度纹理会保存在内置变量 _CameraDepthTexture 中。 1)深度纹理采样 // 非线性的深度(即计算的深度值与实际深度值不是线性关系) float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); // tex2D(_CameraDepthTexture, i.uv).r ...
camera.depthTextureMode = DepthTextureMode.Depth; 一旦设置好上面的摄像机模式后,我们就可以在Shader中声明_CameraDepthTexture来访问它。 Unity为我们提供了统一的宏SAMPLE_DEPTH_TEXTURE用来处理这些平台差异(比如PS3和PS2)造成的问题。例如: float d = SAMPLE DEPTH TEXTURE (_CameraDepthTexture , i.uv) ; ...
SAMPLE_DEPTH_TEXTURE_PROJ 宏同样接受两个参数——深度纹理和一个float3或float4类型的纹理坐标,它的内部使用了tex2Dproj这样的函数进行投影纹理采样,纹理坐标的前两个分量首先会除以最后一个分量,再进行纹理采样。如果提供了第四个分量,还会进行一次比较, 通常用于阴影的实现中。SAMPLE_DEPTH_TEXTURE_PROJ 的第二...
然后我们可以将片段UV和缓冲区深度添加到Fragment中。使用Point钳位采样器通过SAMPLE_DEPTH_TEXTURE宏对摄像机深度纹理进行采样,以检索缓冲区深度。该宏与SAMPLE_TEXTURE2D相同,但仅返回R通道。 这给了我们原始的深度缓冲值。要将其转换为视图空间深度,可以在使用正交摄影机的情况下再次调用OrthographicDepthBufferToLinear,...
f.depth = IsOrthographicCamera() ? OrthographicDepthBufferToLinear(positionSS.z) : positionSS.w; f.bufferDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, sampler_point_clamp, f.screenUV); f.bufferDepth = IsOrthographicCamera() ? OrthographicDepthBufferToLinear(f.bufferDepth) : LinearEyeDepth(f....
SAMPLE_DEPTH_TEXTURE_PROJ 宏同样接受两个参数——深度纹理和一个float3或float4类型的纹理坐标,它的内部使用了tex2Dproj这样的函数进行投影纹理采样,纹理坐标的前两个分量首先会除以最后一个分量,再进行纹理采样。如果提供了第四个分量,还会进行一次比较, 通常用于阴影的实现中。SAMPLE_DEPTH_TEXTURE_PROJ 的第二...