4

任何人都知道为什么在 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() ,但这似乎也不起作用。

在此处输入图像描述

4

2 回答 2

4

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

这种新架构的一个结果是,您不能像在 Windows XP 中(或在禁用桌面组合的 Windows Vista+ 中)那样绘制单个缓冲应用程序(无论如何都在窗口模式下)。简而言之,DWM 使用渲染上下文的后台缓冲区的副本进行合成。您应该切换到双缓冲绘图。

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

于 2013-08-28T01:45:51.743 回答
2

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

如果这不起作用,请尝试通过更改glClearglClear(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(或更高版本)教程。

于 2013-08-28T01:40:37.033 回答