Как читать только компоненты R и G из вывода фрагмента шейдера? - PullRequest
0 голосов
/ 04 марта 2019

Я использую внеэкранный рендеринг в текстуру для простого вычисления GPU.Я использую

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, texSize, texSize, 0, GL_RGBA, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

для выделения памяти для текстуры и

glReadPixels(0, 0, texSize, texSize, GL_RGBA, GL_FLOAT, data);

для считывания вычисленных данных.Проблема в том, что интересующий меня фрагментный шейдер выводит только vec2, поэтому первые два слота цветового вложения заполнены, а два других - мусор.Затем мне нужно постобработать data, чтобы взять только два из каждых четырех float с, что потребует ненужных циклов и памяти.

Если бы это было одно значение, я бы использовал GL_RED,если бы это было три, я бы использовал GL_RGB в моем glReadPixels.Но я не мог найти формат, который будет читать два значения.Я использую GL_RGBA только для удобства, так как кажется более естественным брать 2 числа с плавающей точкой из 2 × 2, чем из 3.

Есть ли другой способ, который будет читать все полученные vec2 плотно упакованные?Я думал о том, чтобы читать только RED, как-то убедить OpenGL пропустить четыре байта после каждого значения, а затем прочитать GREEN только в тот же массив, чтобы заполнить пробелы.С этой целью я пытался изучить glPixelStore, но, похоже, не для этой цели.Это вообще возможно или вообще возможно?

1 Ответ

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

Если вы хотите только прочитать компоненты RG изображения, вы используете формат передачи GL_RG в вашей команде glReadPixels.

Однако это будет медленное чтение если ваше изображение также хранит только 2 канала.Таким образом, внутренний формат вашего изображения должен быть GL_RG32F.

...