2013-11-27 11 views
1

Относительно моего other question, я думаю, что более центральным будет вопрос, как вы визуализируете QImage с OpenGL?Render QImage с OpenGL

Я думаю, что код должен выглядеть примерно так, но я не уверен, что мне еще нужно, кроме, может быть, convertToGLFormat(img).

glEnable(GL_TEXTURE_2D); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glGenTextures(1, &offscreenBufferTexture); 
glBindTexture(GL_TEXTURE_2D, offscreenBufferTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgGL.width(), 
     imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 
     imgGL.bits()); 

glBegin(GL_QUADS); 
    glTexCoord2d(0,0); glVertex2d(0, 0); 
    glTexCoord2d(1,0); glVertex2d(windowSize.width(), 0); 
    glTexCoord2d(1,1); glVertex2d(windowSize.width(), windowSize.height()); 
    glTexCoord2d(0,1); glVertex2d(0, windowSize.height()); 
glEnd(); 
glDisable(GL_TEXTURE_2D); 

Кроме того, я думал, что быстро и грязно, вы можете использовать glDrawPixels() (хотя вы не должны), как

glDrawPixels(imgGL.width(), imgGL.height(), GL_RGBA, 
     GL_UNSIGNED_BYTE, imgGL.bits()); 

Но так или иначе я не могу видеть изображение, просто белый квадрат с его размер. Мне что-то не хватает.

+0

Вы подтвердили, что 'imgGL' имеет тот же формат, что и' GL_RGBA/GL_UNSIGNED_BYTE'? – cmannett85

+0

Да, потому что я создаю 'QImage' из буфера' SoOffscreenRenderer', который использует 'GL_UNSIGNED_BYTE' и где я могу установить, использует ли он' RGB' или 'RGBA'. Я пробовал обе версии, но он не будет отображаться в любом случае. – Dreiven

ответ

2

Мне удалось нарисовать QImage с OpenGL от источника изображения, но не от SoOffscreenRenderer, как описано here.

void init(){ 
    loadTexture2("kitten.png", backgroundimage); 
} 

QImage loadTexture2(char *filename, GLuint &textureID){ 
    glEnable(GL_TEXTURE_2D); // Enable texturing 

    glGenTextures(1, &textureID); // Obtain an id for the texture 
    glBindTexture(GL_TEXTURE_2D, textureID); // Set as the current texture 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

    QImage im(filename); 
    QImage tex = QGLWidget::convertToGLFormat(im); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 

    glDisable(GL_TEXTURE_2D); 

    return tex; 
} 

void renderSceneGL2(){ 
    glClearColor(0.4f, 0.1f, 0.1f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, backgroundimage); 

    glBegin(GL_QUADS); 
     glTexCoord2f(0,0); glVertex3f(-1, -1, -1); 
     glTexCoord2f(1,0); glVertex3f(1, -1, -1); 
     glTexCoord2f(1,1); glVertex3f(1, 1, -1); 
     glTexCoord2f(0,1); glVertex3f(-1, 1, -1); 

    glEnd(); 

    glDisable(GL_TEXTURE_2D); 
} 

Также QGLWidget::convertToGLFormat бросает случайные ошибки Access violation время от времени.

+0

Почему вы загружаете текстуру каждый раз, когда рисуете рамку? Я думаю, что вы должны называть его в своей функции init. – Nazar554

+0

Ну, вы правы, это не имеет смысла в том, как структурирован пример. Я собираюсь изменить его. – Dreiven

+0

Будет ли отображаться альфа-канал правильно? – eudoxos

 Смежные вопросы

  • Нет связанных вопросов^_^