OpenGL - 有没有办法将深度值存储在1以上?

时间:2018-05-17 20:48:17

标签: opengl framebuffer depth-buffer depth-testing

我正在尝试在GPU上实现碰撞检测,如本文所述:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch29.html

在步骤2-网格生成中,我们使用深度测试来确保我们只编写大于前一个的粒子ID。

我现在通过将ID号除以粒子总数来实现此目的:

  

gl_FragDepth = v_ID / u_totalParticleCount;

但我担心如果我到达一个有很多粒子的点,我就没有足够的精确度。

我尝试将RGBA32F纹理附加到我的帧缓冲深度附件,但我猜这是不允许的。

有办法做到这一点吗?或者只是将我的ID放入0-1空间?

非常感谢!

2 个答案:

答案 0 :(得分:3)

window-space深度被限制在private void setTextColor(TextView tv, int color){ tv.setTextColor(ContextCompat.getColor(tv.getContext(), color)); } 指定的范围内。并this function 将您提供的值限制在[0,1]范围内。

有一个NVIDIA扩展程序可以解决此问题:NV_depth_range_float。但除此之外,浮点深度缓冲区的存在主要是为了在[0,1]中提供更大的精度,而不是更大的数字。

深度组件纹理必须使用depth image formats。他们不存储RGBA;他们存储glDepthRange数据。因此,32位浮点图像格式为DEPTH_COMPONENT

答案 1 :(得分:0)

我不确定使用深度缓冲区是否是最佳路径,因为你所做的事情与深度没有任何关系,而且很多硬件(特别是AMD)都有一些深度优化你会破碎的。

有很多帧缓冲格式可以支持您尝试做的事情,使用更清晰的解决方案(例如,32位整数格式,对于多达40亿个粒子来说都可以)。