我的程序的目标是使用OpenGL将来自我的Kinect的视频流与简单的三角形混合。为了显示我的视频流,我加载了一个简单的四边形,我将视频帧缓冲区放在它上面,就像经典的纹理映射一样。直到这里一切都好。但是如果我在我的场景中添加一个简单的彩色三角形(我的三个顶点的红色,绿色和蓝色),三角形会正确显示,但我的纹理会被涂成蓝色。事实上,API似乎保留了我的三角形的最后一个顶点的最后一个颜色,所以这里是蓝色。但我不明白为什么要保留它。
这是第一帧的屏幕(一切正确):
第二帧及以下帧的出现:
我的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)
,然后循环回到开头。