撕裂OpenGL?

kay*_*kun 1 c++ opengl winapi

我正在使用win32和opengl,我在窗口坐标的glOrtho处设置了一个窗口.我启用了双缓冲,并使用glGet进行了测试.我的程序似乎总是撕掉我试图在其上绘制的任何原语,如果它不断翻译的话.

这是我的OpenGL初始化函数:

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glViewport(0, 0, 640, 480);
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 640, 0, 480, 0, 100);

glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDrawBuffer(GL_BACK);

glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)

这是我的渲染函数,gMouseX和gMouseY是鼠标的坐标:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glTranslatef(gMouseX, gMouseY, 0.0f);
glColor3f(0.5f, 0.5f, 0.5f);
glBegin(GL_TRIANGLES);
    glVertex2f(0.0f, 128.0f);
    glVertex2f(128.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);
glEnd();

SwapBuffers(hDC);
Run Code Online (Sandbox Code Playgroud)

无论渲染功能运行的频率如何,都会出现相同的撕裂问题.我有什么问题或错过了吗?

Ash*_*ain 7

如果你只是渲染一个或两个trianges,你将会有一个疯狂的高帧率(可能是成千上万的FPS),这意味着它是像地狱一样的SwapBuffering,这意味着你可能总是在屏幕刷新期间交换(即使有双缓冲).一旦你的场景进入更多内容并且帧速率降到更逼真的值,它应该停止撕裂.或者,查看启用V-Sync,例如wglSwapIntervalEXT在Windows上.

  • @kaykun:wgl_ext_swap_control不是GL扩展名.这是一个_wgl_扩展名.有关如何处理wgl扩展的一般信息,请参见http://www.opengl.org/registry/specs/EXT/wgl_extensions_string.txt.Windows上的所有现代GL实现都支持它,afaik. (3认同)