我正在尝试在GPU上实现碰撞检测,就像这篇文章一样:
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch29.html
在步骤 2 - 网格生成中,我们使用深度测试来确保我们只写入大于前一个的粒子 ID。
我现在通过将 ID 号除以粒子总数来工作:
gl_FragDepth = v_ID/u_totalParticleCount;
但我担心如果我到达一个有很多粒子的点,我就没有足够的准确性。
我尝试将RGBA32F纹理附加到我的帧缓冲深度附件中,但我想这是不允许的。
有没有办法做到这一点?还是将我的 ID 放入 0-1 空间是唯一的方法?
多谢!
窗口空间深度被限制在glDepthRange
指定的范围内。此函数将您提供的值固定在范围 [0, 1]。
有一个NVIDIA扩展可以关闭这种钳制:NV_depth_range_float。但除此之外,浮点深度缓冲区的存在主要是为了在 [0, 1] 中提供更高的精度,而不是更大的数字。
深度组件纹理必须使用深度图像格式。他们不存储 RGBA;它们存储DEPTH_COMPONENT
数据。因此,GL_DEPTH_COMPONENT32F
32 位浮点图像格式。
我不确定为此使用深度缓冲区是否是最佳路径,因为您正在做的事情与深度没有任何关系,并且许多硬件(尤其是 AMD)对深度进行了一些优化,您将打破。
有很多帧缓冲区格式可以支持您尝试做的事情,使用更干净的解决方案(例如,32 位整数格式,对于多达 40 亿个粒子
来说就可以了)。