自从用了深度图后,对它喜爱非常,各种奇淫巧技,使用场景越来越多,但感觉官方对于深度图这一块的文档与支持相当乏善可陈。
说一下需求,想做一个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,应该是获取失败,上面有报警告。
我怀疑是不能一边写一边读,干活去了等下有空再来
请教一下,应该怎么写呢。
应该不是。
为啥不用射线检测
不想加物理,有很多个人。用了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赞
感谢各位大佬的回复,我来试一下。
发现这个DepthTex不会实时更新,相机移动的时候 景深或者雾还是停留在原来的范围没有随着相机移动