2013-11-27 146 views
1

與我的other question相關,我認爲更核心的問題是,如何渲染帶有OpenGL的QImage使用OpenGL渲染QImage

我認爲代碼看起來像這樣,但我不知道我還需要什麼,除了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

是的,因爲我從使用'GL_UNSIGNED_BYTE'的SoOffscreenRenderer'緩衝區創建'QImage',並且可以在其中使用'RGB'或'RGBA'設置。我嘗試了兩種版本,但它不會以任何方式顯示。 – Dreiven

回答

2

我設法用OpenGL從圖片源中繪製出QImage,但不能從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

Alpha通道是否會被正確渲染? – eudoxos