【问题标题】:Double Buffering not Working OpenGL双缓冲不起作用OpenGL
【发布时间】:2012-07-29 16:07:05
【问题描述】:

我想把它做成双缓冲,但它仍然在闪烁。它基本上是 OpenNI UserTracker 示例的修改版本,它在我的计算机上运行良好,但我认为我没有删除或显着更改任何重要的 OpenGL 命令,使其运行方式不同。我在我的电脑上运行 Ubuntu 10.04。

#include <GL/glut.h>
#include <GL/glx.h>
void DrawRectangle(float topLeftX, float topLeftY, float bottomRightX, float bottomRightY){
    GLfloat verts[8] = { topLeftX, topLeftY,
        topLeftX, bottomRightY,
        bottomRightX, bottomRightY,
        bottomRightX, topLeftY };
    glVertexPointer(2, GL_FLOAT, 0, verts);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
void DrawTexture(float topLeftX, float topLeftY, float bottomRightX, float bottomRightY){
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
    DrawRectangle(topLeftX, topLeftY, bottomRightX, bottomRightY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
void DrawLimb(KinectUserData player, int a, int b){
    glBegin(GL_LINES);
        glVertex3d((player.joints[a].x/500), (player.joints[a].y/400), 0);
        glVertex3d((player.joints[b].x/500), (player.joints[b].y/400), 0);
    glEnd();
}
void Draw(KinectData kdata){
    glColor4f(0.75,0.75,0.75,1);
    glEnable(GL_TEXTURE_2D);
    DrawTexture(320,240,0,0);   
    glDisable(GL_TEXTURE_2D);
    for (uint i = 0; i < kdata.size(); i++){
        glColor4f(1-Colors[kdata[i].getID()%nColors][0], 1-Colors[kdata[i].getID()%nColors][1], 1-Colors[kdata[i].getID()%nColors][2], 1);
        DrawLimb(kdata[i], 0, 1);
        DrawLimb(kdata[i], 1, 3);
        DrawLimb(kdata[i], 3, 4);
        DrawLimb(kdata[i], 4, 5);
        DrawLimb(kdata[i], 1, 6);
        DrawLimb(kdata[i], 6, 7);
        DrawLimb(kdata[i], 7, 8);
        DrawLimb(kdata[i], 3, 2);
        DrawLimb(kdata[i], 6, 2);
        DrawLimb(kdata[i], 2, 9);
        DrawLimb(kdata[i], 9, 10);
        DrawLimb(kdata[i], 10, 11);
        DrawLimb(kdata[i], 2, 12);
        DrawLimb(kdata[i], 12, 13);
        DrawLimb(kdata[i], 13, 14);
        DrawLimb(kdata[i], 9, 12);
    }
}
void glutDisplay(void){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_TEXTURE_2D);
    Draw(data); //data is correctly intialized in other functions
    glPopMatrix();
    glutSwapBuffers();
    glutPostRedisplay();
}
void glInit(int * pargc, char ** argv){
    glutInit(pargc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    glutCreateWindow("Tracker");
    glutSetCursor(GLUT_CURSOR_NONE);
    glutDisplayFunc(glutDisplay);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}
int main(int argc, char** argv){
    glInit(&argc, argv);
    glutMainLoop();
}

【问题讨论】:

  • 你的 glutDisplay 功能似乎被切断了,你能用完整的东西更新你的帖子吗?
  • 很抱歉。现在已修复。
  • 我只用一个三角形替换了绘图功能,它对我有用......根本没有闪烁。如果我删除 GLUT_DOUBLE 和交换缓冲区调用,它会像疯了一样回到闪烁......
  • 你为什么使用glutDisplayFuncglutPostRedisplay?您可以将您的glutDisplay 函数赋予glutIdleFunc 并删除glutPostRedisplay。还要避免编写以glut 开头的自己的函数名!它变得令人困惑。
  • @Shahbaz:我只是尝试这样做,它使闪烁更加严重。另外,对不起这些名字;当我修改现有代码时,我只是懒得更改函数的名称。

标签: opengl doublebuffered


【解决方案1】:

我想把它做成双缓冲,但它仍然在闪烁。

这些是不同的问题。您的代码使用双缓冲。

闪烁很可能是由于缺乏垂直同步。不幸的是,启用/禁用 vsync 是 very platform-specific

【讨论】:

  • 我尝试将 glXSwapInterval(或 glXSwapIntervalSGI)添加到我的代码中,但编译器无法识别这些函数。我需要包括什么?我已经添加了“#include ”,但它仍然无法识别它们。
  • 好的,我包含了 glxew.h,现在当我调用 glXSwapIntervalSGI(1) 时出现错误:未定义对 __glewXSwapIntervalSGI 的引用。我在 glxew.h 中找到了 extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; 行,但我不知道如何初始化它,因为我不知道 PFNGLXSWAPINTERVALSGIPROC 是什么。你有什么建议吗?
  • 我也可以只创建一个未初始化的 __glewXSwapIntervalSGI,但随后我得到一个段错误,因为它是由 glXSwapIntervalSGI 调用的。
  • 您是从源代码构建 GLEW 还是使用 Ubuntu 存储库中的版本?如果您使用的是 repo 版本,只需通过 -lGLEW-lglew 链接 GLEW,不确定它是如何大写的。
  • 另外,在开始使用函数指针之前不要忘记initialize GLEW
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2013-03-05
  • 2015-08-02
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多