0

我正在尝试像这篇文章一样在 GPU 上实现碰撞检测:

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

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

我现在可以通过将 ID 号除以粒子总数来进行此操作:

gl_FragDepth = v_ID/u_totalParticleCount;

但我担心如果我到达一个有很多粒子的点,我将没有足够的准确性。

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

有没有办法做到这一点?还是将我的 ID 放入 0-1 空间是唯一的方法?

非常感谢!

4

2 回答 2

3

窗口空间深度被限制在 指定的范围内glDepthRange此函数将您 提供的值限制在[0, 1] 范围内。

有一个 NVIDIA 扩展可以关闭这种限制:NV_depth_range_float。但除此之外,浮点深度缓冲区的存在主要是为了在 [0, 1] 中为您提供更高的精度,而不是更大的数字。

深度分量纹理必须使用深度图像格式。他们不存储RGBA;他们存储DEPTH_COMPONENT数据。因此 32 位浮点图像格式将是GL_DEPTH_COMPONENT32F.

于 2018-05-17T23:48:07.697 回答
0

我不确定为此使用深度缓冲区是否是最佳路径,因为您所做的与深度没有任何关系,而且很多硬件(尤其是 AMD)对深度进行了一些优化被打破。

有很多帧缓冲区格式可以支持您正在尝试做的事情,并提供更简洁的解决方案(例如,32 位整数格式,最多可容纳 40 亿个粒子)。

于 2018-05-17T22:18:34.800 回答