【问题标题】:Texture mapping does not work correctly using OpenGL使用 OpenGL 时纹理映射无法正常工作
【发布时间】:2013-07-15 11:47:35
【问题描述】:

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

【问题讨论】:

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

标签: opengl textures texture-mapping opengl-3


【解决方案1】:

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

在第一帧,您的颜色是全白的,因此图像可以正确显示。但是,最后一次调用glColor(0,0,255),然后循环又回到开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多