假设我有一个带有单个深度组件的2D纹理。使用内置的深度测试将这样的图像平铺成一维纹理(也使用深度分量)的最快方法是什么,这样最终输出纹理包含输入纹理的每一列的所有最低深度值?
想到的显而易见的方法是编写一个手动组合每列的片段着色器:
//Intended as Pseudocode, not actually tested.
//The input texture and it's height
uniform sampler2D input_texture;
uniform float input_height;
//The fragments position in clip space
varying vec2 position;
void main() {
float depth = 1.0;
for (float y = 0.0; y < input_height; y += 1.0) {
float sample = texture2D(input_texture, vec2(position.x, y/input_height)).x;
depth = min(depth, sample);
}
gl_FragDepth = depth;
}
但这并不能完全利用GPU上的并行性。
类似的技术是为2d纹理中的每个像素生成一个片段,但忽略y坐标或沿着这些线的某些东西,但我很确定这是不可能的,因为我们不# 39; t完全控制片段生成。
请注意,出于兼容性考虑,我需要将此限制为OpenGL 3.0或更低版本。我知道4.0+可能有更好的方法,但在我的情况下这些方法并不可行。