2010-07-06 18 views
5

Mam kilka (OpenCV) kod, który generuje obrazy. Wyświetlam je za pomocą OpenGL. Kiedy nowe obrazy są tworzone uruchomić następującą funkcję (za każdym razem) o tej samej nazwie i texture nowego image:Dynamiczna zmiana tekstury w OpenGL

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); 
} 

zainicjować pierwszy obraz przedglutMainLoop() i wyświetla poprawnie. Podano identyfikator 1. Kiedy ponownie zaktualizuję obraz, obraz się nie zmienia. (Potwierdziłem, że wywoływana jest funkcja wyświetlania i że obraz jest inny.)

Edytuj: Kolejna wskazówka, mam podokienki. Jeśli skomentuję inne moje okno, kod działa zgodnie z oczekiwaniami.

+0

Nawiasem mówiąc, 'glGetError()' zwraca '0'. – Geoff

+1

Jestem zdziwiony, że wygląda * tak * dobrze ... – Staffan

+0

Czy bufor z buforem i bufor kolorów są czyste, gdy próbujesz odświeżyć obraz? Czy są operacje matrycowe? glScissor? A może glViewport miał dziwną wartość? Co się dzieje, gdy używasz glTexImage2d dla każdej klatki zamiast SubImage2D? Myślę, że jest to powiązane z kodem podokiennym - prawdopodobnie glViewport lub glScissors lub czymś podobnym. – SigTerm

Odpowiedz

2

Ponieważ działa poprawnie bez "podokien", domyślam się, że masz wiele kontekstów OpenGL w swojej aplikacji i że aktualizacja tekstury odbywa się z nieprawidłowym kontekstem aktywnym.

Spróbuj wstawić teksturę do funkcji wyświetlania i sprawdź, czy to ma znaczenie.

+0

Prawidłowo! Dzięki! Przed wywołaniem powyższej funkcji wstawiłem 'glutSetWindow (leftPanel);'. – Geoff

1

Czy próbujesz pokazać nowe obrazy w sekwencji zamiast istniejących?
W takim przypadku wystarczy zmienić image.data, a nie tworzyć nowe powiązanie tekstury.

+0

Tak (zaktualizowałem pytanie, aby było nieco bardziej zrozumiałe). Myślałem, że tablica jest kopiowana, gdy zadzwonisz do którejś z tych funkcji. Czy tak nie jest? Jeśli tak, moje dane obrazowe zdecydowanie wykraczają poza zakres. – Geoff

+0

Załóżmy, że mają ten sam rozmiar/format/etc, po prostu skopiuj nowe dane pikseli do image.data patrz http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml –

Powiązane problemy