我想以稍微不同寻常的方式使用深度缓冲,并且我被所有规范化、缩放和其他操作所搞糊涂了。
我的计划是通过 AMD 的一些人实现空间哈希算法 (pdf 链接)。
tl;dr 版本:通过将 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);
那有点起作用,但是实际存储在当前帧缓冲区绑定的深度纹理中的值让我感到困惑。 如果我无法输出实际整数,并且当以后从深度纹理中读取时,无论我设置什么内部格式(DepthComponent24、32、32f),一切似乎都被规范化为
[0..1]
,我就不太明白浮点深度缓冲区和整数版本之间的区别了。有人能给我一些建议如何从这些深度纹理中获取顶点ID吗?
谢谢。