如何使用深度缓冲区来存储索引

时间:2013-07-26 01:11:51

标签: opengl glsl shader depth-buffer

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

我的计划是由AMD的一些人(link to pdf)实现空间哈希算法。

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

我的问题是VertexID显然是一个整数,范围从0到顶点ParticleCount的总量,但不能直接使用,因为顶点着色器的输出有要在OpenGL中标准化为[-1..1)(或在DirectX中为[0..1))。

我的顶点着色器因此做了类似的事情:

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

这有点工作,但实际存储到绑定到当前帧缓冲区的深度纹理的值会让我感到困惑。 我不太了解浮点深度缓冲区和整数版本之间的区别,如果我甚至无法输出实数整数,并且从深度纹理读取后,所有内容似乎都被标准化为[0..1]无论如何我设置的内部格式(DepthComponent24,32,32f)。

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

由于

1 个答案:

答案 0 :(得分: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