在渲染成几个部分的图像的着色器中重建
Reconstruction in a shader of an image rendered into several parts
我正在尝试重建按列渲染的图像。
计数器 cpt_x 从 0 到 4 循环递增。
每次通过时,每 5 个像素只显示 5 个像素中的一个。
因此,在第一遍期间,显示像素 0、5、10、15、20、25 等。 => cpt_x = 0
然后在第二遍中,显示像素1、6、11、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值,所以我不能再使用这个技巧了。
我尝试在片段着色器中重建图像,但没有任何显示。
这个shader的objective是将图像的像素复制到它们的位置,它会被调用5次,每次生成最终图像的1/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 创建的,因为我认为这是坐标问题。
我的所有变量都不相同 space。现在的代码更简单了:
#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);
}
我正在尝试重建按列渲染的图像。 计数器 cpt_x 从 0 到 4 循环递增。 每次通过时,每 5 个像素只显示 5 个像素中的一个。
因此,在第一遍期间,显示像素 0、5、10、15、20、25 等。 => cpt_x = 0
然后在第二遍中,显示像素1、6、11、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值,所以我不能再使用这个技巧了。
我尝试在片段着色器中重建图像,但没有任何显示。
这个shader的objective是将图像的像素复制到它们的位置,它会被调用5次,每次生成最终图像的1/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 创建的,因为我认为这是坐标问题。
我的所有变量都不相同 space。现在的代码更简单了:
#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);
}