Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中展平二维纹理_Opengl_Textures_Glsl_Flatten - Fatal编程技术网

在OpenGL中展平二维纹理

在OpenGL中展平二维纹理,opengl,textures,glsl,flatten,Opengl,Textures,Glsl,Flatten,假设我有一个带有单个深度分量的2D纹理。使用内置深度测试将此类图像展平为1D纹理(也带有深度分量)的最快方法是什么,以便最终输出纹理包含输入纹理每列的所有最低深度值 我想到的一个明显的方法是编写一个片段着色器,手动组合每一列: //Intended as Pseudocode, not actually tested. //The input texture and it's height uniform sampler2D input_texture; uniform float input

假设我有一个带有单个深度分量的2D纹理。使用内置深度测试将此类图像展平为1D纹理(也带有深度分量)的最快方法是什么,以便最终输出纹理包含输入纹理每列的所有最低深度值

我想到的一个明显的方法是编写一个片段着色器,手动组合每一列:

//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;
}
//用作伪代码,未实际测试。
//输入纹理及其高度
均匀的二维输入纹理;
均匀浮动输入高度;
//片段在剪辑空间中的位置
可变vec2位置;
void main(){
浮动深度=1.0;
用于(浮动y=0.0;y<输入高度;y+=1.0){
浮动样本=纹理2d(输入纹理,vec2(位置x,y/输入纹理高度)).x;
深度=最小值(深度,样本);
}
gl_FragDepth=深度;
}
但这并不能完全利用GPU上的并行性

一种类似的技术是为2d纹理中的每个像素生成一个片段,但这忽略了y坐标或沿这些线的某些东西,但我很确定这是不可能的,因为我们无法完全控制片段生成


请注意,出于兼容性目的,我需要将此限制为OpenGL 3.0或更低版本。我知道对于4.0+可能有更好的方法,但在我的情况下,这些方法是不可行的。

您可以尝试绘制一个像素高的四边形的输入高度,并根据当前绘制的列为每个四边形指定不同的纹理坐标。这样,你就可以摆脱着色器中的循环,只需进行纹理查找并设置碎片深度,然后让硬件深度测试来处理其余的部分。这肯定会起作用,但听起来像是一种类似的黑客解决方法。创建大约2000-4000个不同的四边形来展平一幅图像也是一件非常痛苦的事情。你不需要使用四边形(非多采样)点就可以了。