当我在Windows 7上的Codeblocks中运行过剩项目时,我的OpenGL glFlush()没有显示任何内容。 这是我的主要功能。
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
float Color1=0.0, Color2=0.0, Color3=0.0;
int r,p,q;
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27: // ESCAPE key
exit (0);
break;
case 'r':
Color1=1.0, Color2=0.0, Color3=0.0;
break;
case 'g':
Color1=0.0, Color2=1.0, Color3=0.0;
break;
case 'b':
Color1=0.0, Color2=0.0, Color3=1.0;
break;
}
glutPostRedisplay();
}
void Init(int w, int h)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glViewport(0,0, (GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D( (GLdouble)w/-2,(GLdouble)w/2, (GLdouble)h/-2, (GLdouble)h/2);
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int i=0;
glColor4f(0,0,0,1);
glPointSize(1);
glBegin(GL_POINTS);
for( i=-320;i<=320;i++)
glVertex2f(i,0);
for( i=-240;i<=240;i++)
glVertex2f(0,i);
glEnd();
glColor4f(Color1,Color2, Color3,1);
glPointSize(1);
glBegin(GL_POINTS);
int x=0, y = r;
int d= 1-r;
while(y>=x)
{
glVertex2f(x+p, y+q);
glVertex2f(y+p, x+q);
glVertex2f(-1*y+p, x+q);
glVertex2f(-1*x+p, y+q);
glVertex2f(-1*x+p, -1*y+q);
glVertex2f(-1*y+p, -1*x+q);
glVertex2f(y+p, -1*x+q);
glVertex2f(x+p, -1*y+q);
if(d<0)
d += 2*x + 3;
else
{
d += 2*(x-y) + 5;
y--;
}
x++;
}
glEnd();
glFlush();
//glutSwapBuffers();
}
int main(int argc, char *argv[])
{
printf("Enter the center point and radius: ");
scanf("%d %d %d",&p,&q,&r);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("Circle drawing");
Init(640, 480);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
但是当我更改这两行时,它只是工作正常。
glFlush(); to glutSwapBuffers();和 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);到glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
任何人都能告诉我我的代码存在什么问题以及glFlush()为什么不能正常工作?
答案 0 :(得分:3)
现代图形系统(Windows DWM / Aero,MacOS Quartz Extreme,X11 Composite)围绕组合的概念而构建。组合总是意味着双缓冲,因此依赖缓冲区交换来启动组合刷新。
您可以在Windows上禁用DWM / Aero并限制在X11上使用合成窗口管理器,然后单缓冲的OpenGL应该按预期工作。
但是为什么你想要单缓冲绘图?现代GPU实际上假设双缓冲用于有效地抽取它们的表示流水线。单缓冲没有任何好处。
答案 1 :(得分:-1)
glFlush工作as documented:
The glFlush function forces execution of OpenGL functions in finite time.
这样做,是否会强制所有未完成的OpenGL操作将渲染完成到后台缓冲区。这不会神奇地显示后台缓冲区。为此,您需要交换字体缓冲区和后台缓冲区。
因此正确使用glFlush,与glutSwapBuffers结合使用。但这是多余的,因为无论如何,glutSwapBuffers都会刷新所有出色的渲染操作。
看起来你正在使用一个旧的OpenGL 1.1教程,其中双缓冲是一个昂贵的新奇。目前双缓冲是常态,你需要跳过相当昂贵的箍来获得单缓冲。
由于OpenGL目前的版本是4.6,我建议你至少开始使用4.0。