在OpenGL中展平2D纹理

时间:2014-04-05 08:43:25

标签: opengl textures glsl flatten

假设我有一个带有单个深度组件的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+可能有更好的方法,但在我的情况下这些方法并不可行。

0 个答案:

没有答案