在着色器中重建渲染成多个部分的图像

时间:2019-03-05 23:04:06

标签: glsl fragment-shader

我正在尝试重建按列渲染的图像。 计数器cpt_x在0到4的循环中递增。 每次通过时,每5个像素中仅显示5个像素中的一个。

因此,在第一遍中,显示像素0、5、10、15、20、25等。 => cpt_x = 0

然后在第二遍中显示像素1、6、11、16、16、21、26等。 => cpt_x = 1

在第三遍中,显示像素2、7、12、17、22、27等。 => cpt_x = 2

在第四遍中,显示像素3、8、13、18、23、28等。 => cpt_x = 3

在第五遍中,像素4、9、14、19、24、29等=> cpt_x = 4

由于所有像素均已创建,最后一步将重建图像。

图像生成进展顺利,我什至可以使用以下偏移量在缓冲区纹理中重建最终图像:

glCopyTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, cpt_x, 0, 1920, 1080);

由于我现在需要为每个像素使用不同的cpt_x值,所以我不能再使用此技巧了。

我尝试在片段着色器中重建图像,但是什么也没有显示。

此着色器的目的是将图像的像素复制到其位置,在最终图像的1/5部分的每一代中,它将被调用5次,并在cpt_x中复制多个像素。最终图像的缓冲区。 第一行的第一个像素必须按以下方式组装: 图像1的第一像素,图像2的第一像素,图像5的第一像素,图像1的第二像素,图像2的第二像素,图像5的第二像素等。

#version 330 core

out vec4 FragColor;
in vec2 TexCoords;

uniform int max_x; // equal to 4
uniform int cpt_x; // from 0 to 4
uniform sampler2D my_texture; // this texture contain only 1 column filled every 5 pixels

int coord_x = floor(gl_FragCoord.x / max_x);

vec2 pixel_size = 1.0 / vec2(textureSize(my_texture, 0));

vec4 res = texture(my_texture, vec2(coord_x + cpt_x * pixel_size.x, TexCoords.y));

if (texOneView.a != 0.0)
    FragColor = res;

正如我所说,什么也没显示,我怀疑coord_x的创建,因为我认为这是坐标问题。

1 个答案:

答案 0 :(得分:0)

我并不是所有变量都在同一空间中。现在的代码更简单了:

#version 330 core
out vec4 FragColor;

uniform vec2 max;
uniform vec2 cpt;
uniform sampler2D my_texture;

void main()
{
    vec2 uv = (gl_FragCoord.xy + cpt) / vec2(textureSize(my_texture, 0);
    FragColor = texture(my_texture, uv);
}