请教:如何获取深度图颜色

自从用了深度图后,对它喜爱非常,各种奇淫巧技,使用场景越来越多,但感觉官方对于深度图这一块的文档与支持相当乏善可陈。
说一下需求,想做一个3D割草的游戏,成百上千的怪,花里胡哨的技术(这不重要),有障碍,有台阶,可上坡,可上台,场景建筑乱七八糟。如果用物理来做的话,一是怕性能不如意,二是物理不会障碍躲避。所以使用RVO来做,但既然不用物理,那这个上坡就需要自己实现了,于是我就想到一个办法,从高空用一台正交相机往下拍一张地形高度图,然后角色每次坐标变化时,就从这个高度图当中获得地图高度的张当Y,这样不就可以上坡了吗。
于是我就开干,相机渲染地图到一张RenderTexture当中,获取相机高度图,renderTexture.window.framebuffer.depthStencilTexture,参考RenderTexture.readPixels函数,把getGFXTexture里面的colorTextures[0]换成depthStencilTexture,然后把这个图先渲染到一个Spirte看看内容,结果发现有一个警告,获取内容全是黑的,里面没有内容,求各位高手指点。
运行时报的警告:

let material = this.node.getComponent(MeshRenderer).material;

    material.setProperty(this.samplerName, this.renderTexture.window.framebuffer.depthStencilTexture);

    let pass0 = material.passes[0];

    let bindingIndex = pass0.getBinding(this.samplerName);

    pass0.bindTexture(bindingIndex, this.renderTexture.window.framebuffer.depthStencilTexture);

    pass0.bindSampler(bindingIndex, director.root.pipeline.globalDSManager.pointSampler);

我不是想要把深度图传入Shader,而想在游戏逻辑这边获得深度图的颜色。

都是黑色是因为你没转换成线性深度

不是,我试过了,数值全是0,应该是获取失败,上面有报警告。

请教:如何获取深度图颜色 继续讨论:

看上面提供的代码的最后一句。 应该是需要对这个buffer设置一个采样方法才能由buffer转换成颜色值吧?

我怀疑是不能一边写一边读,干活去了等下有空再来

请教一下,应该怎么写呢。

应该不是。

为啥不用射线检测

不想加物理,有很多个人。用了RVO,也想作一下妖。

可以参考3.8.5 景深的实现:builtin-dof-pass.ts

如果用3.8.4开始的builtin-pipeline,读取深度图还是比较容易的,和读取普通贴图没什么区别。

需要注意的地方:

  • 渲染场景时,记得把StoreOp设置成STORE。为了降低带宽,默认Discard DepthStencil。

  • DepthTex不能是MS(Multi-Sample)的(因为无法跨平台resolve,有的平台不支持)。所以有读取深度的需求时,管线必须关掉MSAA,保证DepthStencil不是MS。

  • DepthTex不能是Swapchain自带的那个。这个和平台相关,可能会有问题。

2赞

正交投影好像没有深度图吧,把主相机和深度投影相机设置成透视投影
效果:image
demo:assets.rar (3.1 MB)

把customerline文件夹删除 然后把下面这个宏打开

感谢各位大佬的回复,我来试一下。

发现这个DepthTex不会实时更新,相机移动的时候 景深或者雾还是停留在原来的范围没有随着相机移动

有几点注意:

  1. dof需要动态设置Focus Pos,也就是焦点所在。
  2. 如果是自己写的component,需要enableStoreSceneDepth
  • 为了移动端性能考虑,我们默认不写入深度到系统内存。
  • component的ConfigOrder必须小于100(默认是0),因为调用enableStoreSceneDepth必须在ForwardPass的configCamera之前(ConfigOrder为100)。

如果还有问题,可以提交一个demo,我们看下问题。

3赞