Реконструкция в шейдер изображения, отрендеренного на несколько частей - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь восстановить изображение, которое было визуализировано по столбцу. Счетчик 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 для каждого пикселя, я больше не могу использовать этот трюк.

Я пытаюсь восстановить изображение в фрагментном шейдере, но ничего не отображается.

Цель этого шейдера - скопировать пиксели изображения в их местоположения, оно будет вызываться 5 раз при каждом поколении 1/5 части окончательного изображения, и копировать несколько пикселей cpt_x в буфер конечного изображения. Первые пиксели первой строки должны быть собраны следующим образом: 1-й пиксель изображения 1, 1-й пиксель изображения 2, [...], 1-й пиксель изображения 5, 2-й пиксель изображения 1, 2-й пиксель изображения 2, [...], 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;

Как я уже сказал, ничего не отображается, я подозреваю, что созданиеordin_x, так как я думаю, что это проблема координат.

1 Ответ

0 голосов
/ 07 марта 2019

Я не был в одном месте для всех моих переменных.Код стал проще:

#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);
} 
...