Динамично изменяя структуру в OpenGL

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

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

5
задан Geoff 7 July 2010 в 12:57
поделиться

2 ответа

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

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

2
ответ дан 15 December 2019 в 06:13
поделиться

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

1
ответ дан 15 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: