2013-07-15 49 views
1

我的程序的目標是使用OpenGL將來自Kinect的視頻流與簡單的三角形混合。爲了顯示我的視頻流,我加載了一個簡單的四邊形,並且將其上的視頻幀緩衝區放在上面,就像經典的紋理貼圖。直到這裏一切都好。但是如果我在場景中添加一個簡單的彩色三角形(我的三個頂點爲紅色,綠色和藍色),三角形將正確顯示,但我的紋理會被染成藍色。實際上,API似乎保留了我三角形最後一個頂點的最後一個顏色,因此這裏是藍色。但我不明白它爲什麼保留它。使用OpenGL紋理映射無法正常工作

這裏的第一個幀的畫面(全部是正確的):

enter image description here

而第二個的appearence和下面的框架:

enter image description here

而且我的C++渲染代碼:

getKinectVideoData(_videoData); //Method that fills the video frame buffer for each frame 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClearDepth(1.0f); 

    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f, (float)width/(float)height, 1.0f, 100.0f); 
    gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

    glMatrixMode(GL_MODELVIEW); 

    glBindTexture(GL_TEXTURE_2D, textureId); 


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (GLvoid*)_videoData); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    glEnable(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, textureId); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (GLvoid*)_videoBuffer->GetBuffer()); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); 
    glVertex3f(-1, -1, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); 
    glVertex3f(1, -1, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); 
    glVertex3f(1, 1, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); 
    glVertex3f(-1, 1, 0.0f); 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    glDisable(GL_TEXTURE_2D); 

    glBegin(GL_TRIANGLES); 
    glColor3ub(255, 0, 0); 
    glVertex3f(0.0f, 0.75f, 0.0f); 
    glColor3ub(0, 255, 0); 
    glVertex3f(0.75f, 0.0f, 0.0f); 
    glColor3ub(0, 0, 255); 
    glVertex3f(-0.75f, 0.0f, 0.0f); 
    glEnd(); 

我使用glClear調用清除每幀開始處的緩衝區,所以非常奇怪。 有人能幫助我嗎?

+0

此外,它確實工作;它只是不會給你你想要的效果';)' –

回答

2

您必須將顏色重置爲(255, 255, 255)(使用glColor),因爲它會影響紋理處理。

在第一幀上,您的顏色是全白的,因此圖像顯示正確。然而,glColor的最後一次呼叫是(0,0,255),然後循環返回到開頭。

+0

好的。謝謝你的回答。 – user1364743