Копировать вектор <GLubyte>буфер в кадровый буфер - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь избежать использования glDrawPixels в своем коде, поэтому я ищу альтернативу.

Ниже приведен код, который я использую для чтения содержимого кадрового буфера в vector<GLubyte>. Теперь мне нужен код для переноса векторного содержимого обратно в кадровый буфер. Я пробовал дюжину разных попыток, но безуспешно.

glReadBuffer(GL_COLOR_ATTACHMENT0);

GLuint copy_tex = 0;
glGenTextures(1, &copy_tex);

vector<GLubyte> tex_buf(4 * win_x * win_y, 0);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, copy_tex);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, win_x, win_y, 0);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

for (size_t i = 0; i < win_x; i++)
{
    for (size_t j = 0; j < win_y; j++)
    {
        size_t index = 4 * (i*win_y + j);

        tex_buf[index + 0] = 255;
        tex_buf[index + 1] = 127;
        tex_buf[index + 2] = 0;
    }
}

glDrawPixels(win_x, win_y, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

glDeleteTextures(1, &copy_tex);

1 Ответ

0 голосов
/ 29 апреля 2020

glGetTexImage возвращает текстурное изображение. Если вы хотите записать изображение обратно в текстуру, вы можете использовать glTexSubImage2D:

glDrawPixels(GL_TEXTURE_2D, 0, 0, 0, win_x, win_y, GL_RGBA, GL_UNSIGNED_BYTE, &tex_buf[0]);

Если вы хотите скопировать блок пикселей из одного объекта кадрового буфера в другой, тогда Вы можете использовать glBlitFramebuffer. Например, копия из именованного кадрового буфера в стандартный кадровый буфер:

glBindFramebuffer(GL_READ_FRAMEBUFFER, my_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, win_x, win_y, 0, 0, window_h, window_w, GL_COLOR_BUFFER_BIT, GL_LINEAR);

window_h, window_w может отличаться от win_x, win_y и является размером стандартного кадрового буфера.

...