Проблема с изменением содержимого буфера кадров

#opengl

#opengl

Вопрос:

Я пытаюсь повернуть содержимое буфера кадров, поместив его в текстуру, а затем поместив обратно в буфер. Я получаю белый повернутый прямоугольник. Я подозреваю, что я упускаю из виду что-то очевидное. Вот код, который я использую:

   glReadBuffer(GL_AUX1);
  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, textures[1]);
  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, rect.width(),
        rect.height(), 0);
  glDrawBuffer(GL_AUX1);
  glPushMatrix();
  glRotatef(head - new_head, 0, 0, -1);
  glBegin(GL_POLYGON);
  glTexCoord2f(0, 0);
  glVertex2f(-1, -1);
  glTexCoord2f(0, 1);
  glVertex2f(-1, 1);
  glTexCoord2f(1, 1);
  glVertex2f(1, 1);
  glTexCoord2f(1, 0);
  glVertex2f(1, -1);
  glEnd();
  glPopMatrix();
  glDisable(GL_TEXTURE_2D);
  

Я решил проблему. Добавление этих строк, чтобы заставить его работать:

 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  

Комментарии:

1. Опубликуйте свой код для создания текстуры.

2. glCopyTexImage2D — это код создания текстуры (если я правильно читаю справочную страницу). Буфер AUX1 создается в течение определенного периода времени с использованием комбинации векторных и текстурных методов. В этом сегменте кода я создаю временную текстуру, чтобы повернуть содержимое буфера AUX1, а затем поместить их обратно.

Ответ №1:

Вы не можете создать текстуру с помощью glCopyTexImage2D, вы только копируете данные в текстуру, но текстура на этом этапе не завершена, поэтому вы получаете черно-белую текстуру (признак незавершенного состояния).

Решение: Создайте текстуру с:

 glGenTextures(....)
glBindTexture(...)
glTexParameter(...) //Set MIN/MAG filter
glTexImage2D(....., NULL)
  

glTexImage2D определяет изображение текстуры, поскольку вы хотите отобразить эту текстуру (или скопировать в нее), вы передаете NULL для последних параметров, поэтому хранилище текстур создается, но его содержимое остается неопределенным. Другое предложение заключается в использовании объектов фреймбуфера (FBO) для рисования непосредственно в текстуре (без копирования)