2013-11-27 10 views
1

other question과 관련하여 더 중요한 질문은, 어떻게 OpenGL을 사용하여 QImage을 렌더링하겠습니까?렌더링 QImage with 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

예,'GLIUNSIGNED_BYTE'를 사용하는'SoOffscreenRenderer' 버퍼에서'QImage'를 생성하고'RGB' 또는'RGBA'를 사용하는 곳에서 설정할 수 있기 때문에 가능합니다. 두 버전 모두 시도했지만 어느 쪽이든 표시하지 않습니다. – Dreiven

답변

2

그림 소스에서 OpenGL을 사용하여 QImage을 그렸지만 here과 같이 SoOffscreenRenderer은 그려 낼 수 없었습니다.

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