Динамическое изменение текстуры в OpenGL - PullRequest
5 голосов
/ 07 июля 2010

У меня есть некоторый (OpenCV) код, который генерирует изображения.Я показываю их с помощью OpenGL.Когда создаются новые изображения, я запускаю следующую функцию (каждый раз) с тем же именем texture и новым image:

void loadCVTexture(GLuint& texture, const cv::Mat_<Vec3f>& image){
  if(texture != 0){
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.cols, image.rows, GL_BGR, GL_FLOAT, image.data);
  } else {
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, image.cols, image.rows, 0, GL_BGR, GL_FLOAT, image.data);
  }
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}

Я инициализирую первое изображение до glutMainLoop() и отображается правильно.Дается идентификатор 1.Когда я обновляю изображение снова, изображение не меняется.(Я подтвердил, что вызывается функция отображения и что изображение другое.)

Редактировать: Еще одна подсказка, у меня есть подокна.Если я закомментирую другое окно, код будет работать как положено.

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Так как он работает правильно без «подокон», я предполагаю, что у вас есть несколько контекстов OpenGL в вашем приложении, и что обновление текстуры происходит с активным неверным контекстом.

Попробуйте поставитьзагрузите текстуру в функцию отображения и посмотрите, имеет ли это значение.

1 голос
/ 07 июля 2010

Вы пытаетесь показать новые изображения в последовательности вместо существующих?
В этом случае вам просто нужно изменить image.data, а не создавать новую текстурную привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...