Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL时纹理贴图无法正常工作_Opengl_Textures_Texture Mapping_Opengl 3 - Fatal编程技术网

使用OpenGL时纹理贴图无法正常工作

使用OpenGL时纹理贴图无法正常工作,opengl,textures,texture-mapping,opengl-3,Opengl,Textures,Texture Mapping,Opengl 3,我的程序的目标是使用OpenGL将来自Kinect的视频流与简单三角形混合。为了显示我的视频流,我加载了一个简单的四边形,并将视频帧缓冲区放在上面,就像经典的纹理贴图一样。直到这里一切都好。但是,如果我在场景中添加一个简单的彩色三角形(三个顶点分别为红色、绿色和蓝色),三角形将正确显示,但我的纹理被蓝色污染。事实上,API似乎为三角形的最后一个顶点保留加载的最后一种颜色,所以这里的蓝色。但我不明白它为什么要保留它 这是第一帧的屏幕(全部正确): 以及第二帧和以下帧的外观: 和我的C++渲染代

我的程序的目标是使用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调用在每帧开始时清除缓冲区,因此这非常奇怪。
有人能帮我吗?

您必须将颜色重置为
(255、255、255)
(使用
glColor
),因为它会影响纹理处理


在第一帧上,您的颜色为全白色,因此图像显示正确。但是,对
glColor
的最后一次调用是
(0,0255)
,然后循环返回到开始处。

此外,它确实工作正常;它只是没有给你想要的效果(
;)