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...
简单来说在Unity中,Camera可以生成depth,depth+normals,motion vector三种texture。这些texture在可以帮助我们实现一些很牛的效果,而其中的depth texture就是我们要的深度图。 我们可以通过设置Camera的depthTextureMode属性来使Camera生成对应的texture,例如下面代码可以使Camera生成depth texture(开启后会造成一定的性能消耗):...
(Camera-DepthNormaITexture.shader) 获取深度纹理代码: 获取深度+法线纹理: 在Shader中可以直接访问深度纹理_CameraDepthTexture,为了处理平台差异,Unity提供一个统一的宏对深度纹理进行采样 SAMPLE_DEPTH_TEXTURE(大多数情况下可以直接使用tex2D函数进行采样)。其中 i.uv 是当前像素的纹理坐标,float2类型变量。 类似的...
camera.depthTextureMode = DepthTextureMode.Depth; 一旦设置好上面的摄像机模式后,我们就可以在Shader中声明_CameraDepthTexture来访问它。 Unity为我们提供了统一的宏SAMPLE_DEPTH_TEXTURE用来处理这些平台差异(比如PS3和PS2)造成的问题。例如: float d = SAMPLE DEPTH TEXTURE (_CameraDepthTexture , i.uv) ; flo...
SAMPLE_DEPTH_TEXTURE_PROJ 宏同样接受两个参数——深度纹理和一个float3或float4类型的纹理坐标,它的内部使用了tex2Dproj这样的函数进行投影纹理采样,纹理坐标的前两个分量首先会除以最后一个分量,再进行纹理采样。如果提供了第四个分量,还会进行一次比较, 通常用于阴影的实现中。SAMPLE_DEPTH_TEXTURE_PROJ 的第二...
SAMPLE_DEPTH_TEXTURE_PROJ 宏同样接受两个参数——深度纹理和一个float3或float4类型的纹理坐标,它的内部使用了tex2Dproj这样的函数进行投影纹理采样,纹理坐标的前两个分量首先会除以最后一个分量,再进行纹理采样。如果提供了第四个分量,还会进行一次比较, 通常用于阴影的实现中。SAMPLE_DEPTH_TEXTURE_PROJ 的第二...
4.2 从 _CameraDepthTexture 中获取深度 如果生成了深度纹理,深度纹理会保存在内置变量 _CameraDepthTexture 中。 1)深度纹理采样 // 非线性的深度(即计算的深度值与实际深度值不是线性关系) float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); // tex2D(_CameraDepthTexture, i.uv).r ...
将片段函数添加到HLSL文件中以绘制深度条纹。从采样深度开始,通过_MainTex进行采样。可以使用SAMPLE_DEPTH_TEXTURE宏使其适用于所有平台。 我们需要世界空间深度,它是到附近位置的距离,而不是相机位置,可以通过LinearEyeDepth函数找到。除了原始深度,它还需要_ZBufferParams,这是SetupCameraProperties设置的另一个向量。
在Shader中,需提前定义纹理_CameraDepthTexture ,为了兼容不同的平台,Unity ShaderLab提供了UNITY_SAMPLE_DEPTH、SAMPLE_DEPTH_TEXTURE方法解决这个问题。 Pass { CGPROGRAM#pragmavertex vert#pragmafragment frag#include"UnityCG.cginc"//提前定义uniform sampler2D_float _CameraDepthTexture;structuinput{ ...
- 设置相机的纹理模式:camera.depthTextureMode = DepthTextureMode.Depth; -在Shdaer中声明变量_CameraDepthTexture访问:float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); 相关函数: - LinearEyeDepth:深度采样结果转换到视角空间,即zview。