У меня есть немного (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
. Когда я обновляю изображение снова, изображение не изменяется. (Я подтвердил, что функция дисплея вызывается, и что изображение отличается.)
Править: Другая подсказка, у меня есть подокна. Если я комментирую свое другое окно, код работает как ожидалось.
Поскольку он работает корректно без "подокон", я предполагаю, что у вас есть несколько контекстов OpenGL в вашем приложении, и что обновление текстуры происходит с неправильным активным контекстом.
Попробуйте поместить загрузку текстуры в вашу функцию отображения и посмотрите, изменит ли это ситуацию.
Вы пытаетесь показать новые изображения в последовательности вместо существующих?
В этом случае вам просто нужно изменить image.data, а не создавать новую привязку текстуры.