sampler2D_CameraDepthTexture;float4frag(v2finput):Color{floatdepth=tex2D(_CameraDepthTexture,input.uv);returnfloat4(depth,0.0f,0.0f,1.0f);} 采样的代码,一般也会写成下面这种形式: floatdepth=UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture,input.uv)); 其中UNITY_SAMPLE_DEPTH的作用就是取r通道的值:...
一旦设置好上面的摄像机模式后,我们就可以在Shader中声明_CameraDepthTexture来访问它。 Unity为我们提供了统一的宏SAMPLE_DEPTH_TEXTURE用来处理这些平台差异(比如PS3和PS2)造成的问题。例如: float d = SAMPLE DEPTH TEXTURE (_CameraDepthTexture , i.uv) ; float d = SAMPLE_DEPTH_TEXTURE_PROJ(_CarneraDepthT...
上面用到了这个宏:SAMPLE_DEPTH_TEXTURE 原型如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 #defineSAMPLE_DEPTH_TEXTURE(sampler,uv)(tex2D(sampler,uv).r) 这句代码也可以写为: tex2D(_CameraDepthTexture, i.uv).r; 从视空间深度转化到屏幕空间深度的公式如下: a = F/(F – N) b = ...
(Camera-DepthNormaITexture.shader) 获取深度纹理代码: 获取深度+法线纹理: 在Shader中可以直接访问深度纹理_CameraDepthTexture,为了处理平台差异,Unity提供一个统一的宏对深度纹理进行采样 SAMPLE_DEPTH_TEXTURE(大多数情况下可以直接使用tex2D函数进行采样)。其中 i.uv 是当前像素的纹理坐标,float2类型变量。 类似的...
对于自身带有ShadowCaster Pass或者FallBack中含有,并且Render Queue小于等于2500的渲染对象才会出现在深度纹理中,详细的测试可以参考:【Unity Shader】Shadow Caster、RenderType和_CameraDepthTexture 在Shader中,需提前定义纹理_CameraDepthTexture ,为了兼容不同的平台,Unity ShaderLab提供了UNITY_SAMPLE_DEPTH、SAMPLE_DEPTH...
{//根据上面的屏幕空间位置,进行透视采样深度图(tex2dproj,即带有透视除法的采样,相当于tex2d(xy/w)),//SAMPLE_DEPTH_TEXTURE_PROJ得到的深度是非线性的floatsceneZ =LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));//像素点在视空间的深度floatpartZ =i.pr...
答案就是Camera Depth Texture这个东东。从字面上理解这个就是相机深度纹理。在Unity中,相机可以产生深度,深度+法线或者运动方向纹理,这是一个简化版本的G-Buffer纹理,我们可以用这个纹理进行一些后处理操作。这张纹理图记录了屏幕空间所有物体距离相机的距离。深度纹理中每个像素所记录的深度值是从0 到1 非线性分布的...
SAMPLE_DEPTH_TEXTURE_PROJ 宏同样接受两个参数——深度纹理和一个float3或float4类型的纹理坐标,它的内部使用了tex2Dproj这样的函数进行投影纹理采样,纹理坐标的前两个分量首先会除以最后一个分量,再进行纹理采样。如果提供了第四个分量,还会进行一次比较, 通常用于阴影的实现中。SAMPLE_DEPTH_TEXTURE_PROJ 的第二...
DEPTH_DEFAULT_VALUE:根据UNITY_REVERSED_Z宏定义深度的默认值为0或者1。 DEPTH_OP:根据UNITY_REVERSED_Z宏定义深度操作函数用max还是min。 SampleDepth:根据是否启用深度多重采样对深度纹理执行循环多重采样或者简单采样,在GLES2上不展开循环,其它平台上均标记为展开循环。 如果UNITY_REVERSED_Z打开,深度默认值为1,循...
如果生成了深度纹理,深度纹理会保存在内置变量 _CameraDepthTexture 中。 1)深度纹理采样 // 非线性的深度(即计算的深度值与实际深度值不是线性关系) float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv); // tex2D(_CameraDepthTexture, i.uv).r ...