我想以一种稍微不正统的方式使用深度缓冲区,我对所有的标准化、缩放以及那里发生的事情感到非常困惑。
我的计划是由 AMD 的一些人实施空间散列算法(链接到 pdf)。
tl;dr-version:通过将 3D 顶点离散化为(平面 2D)深度纹理数组,将深度设置为 VertexID,从而加速最近邻搜索。使用深度纹理的原因是正在进行一些智能深度测试,甚至可以按排序顺序获得结果,但这在这里并不重要。
我的问题是 VertexID 显然是一个整数,范围从0
to 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 吗?
谢谢