C ++ OpenGL窗口仅跟踪背景

时间:2013-08-28 01:09:27

标签: c++ windows opengl

任何人都知道为什么在尝试在OpenGL中生成一个简单的正方形时会发生这种情况?

我使用了以下源代码计算机图形通过OpenGL 从理论到实验

////////////////////////////////////////////////////          
// square.cpp
//
// Stripped down OpenGL program that draws a square.
// 
// Sumanta Guha.
////////////////////////////////////////////////////

#include <iostream>

#ifdef __APPLE__
#  include <GLUT/glut.h>
#else
#  include <GL/glut.h>
#endif

using namespace std;

// Drawing (display) routine.
void drawScene(void)
{
   // Clear screen to background color.
   glClear(GL_COLOR_BUFFER_BIT);

   // Set foreground (or drawing) color.
   glColor3f(0.0, 0.0, 0.0);

   // Draw a polygon with specified vertices.
   glBegin(GL_POLYGON);
      glVertex3f(20.0, 20.0, 0.0);
      glVertex3f(80.0, 20.0, 0.0);
      glVertex3f(80.0, 80.0, 0.0);
      glVertex3f(20.0, 80.0, 0.0);
   glEnd();

   // Flush created objects to the screen, i.e., force rendering.
   glFlush(); 
}

// Initialization routine.
void setup(void) 
{
   // Set background (or clearing) color.
   glClearColor(1.0, 1.0, 1.0, 0.0); 
}

// OpenGL window reshape routine.
void resize(int w, int h)
{
   // Set viewport size to be entire OpenGL window.
   glViewport(0, 0, (GLsizei)w, (GLsizei)h);

   // Set matrix mode to projection.
   glMatrixMode(GL_PROJECTION);

   // Clear current projection matrix to identity.
   glLoadIdentity();

   // Specify the orthographic (or perpendicular) projection, 
   // i.e., define the viewing box.
   glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0);

   // Set matrix mode to modelview.
   glMatrixMode(GL_MODELVIEW);

   // Clear current modelview matrix to identity.
   glLoadIdentity();
}

// Keyboard input processing routine.
void keyInput(unsigned char key, int x, int y)
{
   switch(key) 
   {
  // Press escape to exit.
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

// Main routine: defines window properties, creates window,
// registers callback routines and begins processing.
int main(int argc, char **argv) 
{  
   // Initialize GLUT.
   glutInit(&argc, argv);

   // Set display mode as single-buffered and RGB color.
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 

   // Set OpenGL window size.
   glutInitWindowSize(500, 500);

   // Set position of OpenGL window upper-left corner.
   glutInitWindowPosition(100, 100); 

   // Create OpenGL window with title.
   glutCreateWindow("square.cpp");

   // Initialize.
   setup(); 

   // Register display routine.
   glutDisplayFunc(drawScene); 

   // Register reshape routine.
   glutReshapeFunc(resize);  

   // Register keyboard routine.
   glutKeyboardFunc(keyInput);

   // Begin processing.
   glutMainLoop(); 

   return 0;  
}

我一直在尝试最长的时间......

有关详细信息,请访问:

屏幕打开仅显示背景,如果您拖动它,它将继续跟踪背景,这是将窗口移动到底部然后再次将其移动到原始位置的结果。我在linux机器上测试了相同的源代码,它工作得很好...... :(

编辑:我尝试过使用glutSwapBuffers(),但似乎也没有用。

enter image description here

2 个答案:

答案 0 :(得分:4)

在Windows Vista和较新的Windows操作系统上,有一个称为Desktop Window Manager(DWM)的组件,它有一个称为“桌面组合”的特殊模式,它将窗口绘制到屏幕外缓冲区,然后将它们合成。这样做是为了在Alt + Tab屏幕中提供新的视觉效果,例如实时窗口预览。

这种新架构的结果是您无法以与Windows XP(或禁用桌面组合的Windows Vista +)相同的方式绘制单缓冲应用程序(在窗口模式下)。简而言之,DWM使用渲染上下文的后台缓冲区的副本进行合成。你应该切换到双缓冲绘图。

要在GLUT中使用双缓冲绘图,您可以在调用GLUT_DOUBLE时使用GLUT_SINGLE代替glutInitDisplayMode (...)。此外,您需要将glFlush (...)的来电替换为glutSwapBuffers (...)

答案 1 :(得分:2)

尝试在glutSwapBuffers();末尾添加对drawScene的调用,并从GLUT_SINGLE删除glutInitDisplayMode。单缓冲模式具有各种兼容性问题。在Windows上,它使用的软件光栅化器非常慢并且存在更多问题。

如果不起作用,请尝试通过将glClear更改为glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);并将glClearcolor更改为glClearColor(1.0, 1.0, 1.0, 1.0);来清除深度缓冲区。

此外,此示例使用传统OpenGL,它比现代OpenGL慢得多并且还有许多其他问题。除非您使用的是超过十年的GPU,否则您没有理由使用它。从技术上讲,现代GPU甚至不需要支持它。如果您需要一个好的现代OpenGL教程,http://open.gl是一个很好的教程。只需查看OpenGL 2.1(或更高版本)教程。