我正在尝试在GPU上实现碰撞检测,如本文所述:
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch29.html
在步骤2-网格生成中,我们使用深度测试来确保我们只编写大于前一个的粒子ID。
我现在通过将ID号除以粒子总数来实现此目的:
gl_FragDepth = v_ID / u_totalParticleCount;
但我担心如果我到达一个有很多粒子的点,我就没有足够的精确度。
我尝试将RGBA32F纹理附加到我的帧缓冲深度附件,但我猜这是不允许的。
有办法做到这一点吗?或者只是将我的ID放入0-1空间?
非常感谢!
答案 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亿个粒子来说都可以)。