5

我想以一种稍微不正统的方式使用深度缓冲区,我对所有的标准化、缩放以及那里发生的事情感到非常困惑。

我的计划是由 AMD 的一些人实施空间散列算法(链接到 pdf)。

tl;dr-version:通过将 3D 顶点离散化为(平面 2D)深度纹理数组,将深度设置为 VertexID,从而加速最近邻搜索。使用深度纹理的原因是正在进行一些智能深度测试,甚至可以按排序顺序获得结果,但这在这里并不重要。

我的问题是 VertexID 显然是一个整数,范围从0to total amount of vertices ParticleCount,但这不能直接使用,因为顶点着色器的输出必须[-1..1)在 OpenGL(或[0..1)DirectX)中标准化。

因此,我的顶点着色器会执行以下操作:

float depth = 2.0 * gl_VertexID / ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);

这是一种工作,但实际存储到绑定到当前帧缓冲区的深度纹理的值让我感到困惑。我不太明白浮点深度缓冲区和整数版本之间的区别,如果我什至不能输出真正的整数,并且稍后从深度纹理读取时,[0..1]无论我设置什么内部格式,一切似乎都归一化(深度分量 24、32、32f)。

有人可以给我一些建议如何从这些深度纹理中获取 VertexID 吗?

谢谢

4

1 回答 1

1

OpenGL 中顶点着色器的输出在透视分割被裁剪为 [-1,1] 后,这意味着 gl_Position.z/gl_Position.w 必须在该范围内。但是,实际存储在深度缓冲区中的深度值会使用当前深度范围 (glDepthRange) 值重新映射到 0..1 范围。默认情况下,深度范围为 0..1,即转换为

depth_buf_value = 0.5 + 0.5 * gl_Position.z / gl_Position.w;

因此,在您的情况下,深度缓冲区最终包含 float(gl_VertexID) / ParticleCount 的值,因此:

vertex_id = depth_buf_value * ParticleCount
于 2013-08-06T19:28:52.073 回答