我正在构建一个基于OpenGL构建的简单3D游戏引擎,以及用于窗口化和I / O的GLUT。尝试在引擎中构建运动模糊选项时,我遇到了OpenGL累积缓冲区的问题。从本质上讲,这是我应该为我做的一小段代码:
glAccum(GL_MULT, 0.99f);
glAccum(GL_ACCUM, 1.0f - 0.99f);
glAccum(GL_RETURN, 1.0f);
我首先在我的Render()
方法中植入了这段代码,但它显示了一个看似腐败的视图,其中只有少数几个像素可见。所以,我然后从我找到代码的网站的其余源代码尝试了它。我仍然遇到同样的问题。以下是该问题的图片:
然后,我刚拿出累积缓冲区部分(应该实现运动模糊的三条线),这就是我得到的:
当然,因为我删除了glAccum()
行,所以没有运动模糊,但至少告诉我我的显卡有问题(它不喜欢累积缓冲区吗?)或那些代码行不起作用。
我不知道它是否重要,但是我从2011年开始在MacBook Pro上通过NetBeans 7.2(C ++)运行代码。另外,我 在以下行中请求了一个累积缓冲区:
glutInitDisplayMode(GLUT_DEPTH | GLUT_ACCUM | GLUT_DOUBLE | GLUT_RGBA);
这是我刚刚汇总的一段代码示例。我不确定代码中是否有问题,我知道我可能也没有使用最佳实践,但它得到了重点。我仍然遇到此代码的错误:
#include <iostream>
#include <GLUT/GLUT.h>
using namespace std;
float Rotation = 0.0f;
void Reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1.0f * ((float)height / (float)width), 1.0f * ((float)height / (float)width), 0.1f, 200.0f);
glMatrixMode(GL_MODELVIEW);
}
void Update(int value)
{
Rotation++;
glutPostRedisplay();
glutTimerFunc(17, Update, 0);
}
void InitGL()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_COLOR_MATERIAL);
glClearDepth(100.0f);
}
void Render(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0, 0, 5.0f, 0, 0, 0, 0, 1, 0);
glPushMatrix();
{
glRotatef(Rotation, 0.0, 1.0, 0.0);
/* Render Icosahedron */
glColor3f(0.5f, 0.5f, 0.5f);
glutSolidIcosahedron();
/* Render wireframe */
glColor4f(1.0, 1.0, 1.0, 1.0);
glLineWidth(2.0);
glutWireIcosahedron();
}
glPopMatrix();
/* Blur */
glAccum(GL_MULT, 0.99);
glAccum(GL_ACCUM, 0.01);
glAccum(GL_RETURN, 1.0);
glFlush();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA | GLUT_ACCUM);
glutInitWindowSize(400, 400);
glutCreateWindow("Test");
glutDisplayFunc(Render);
glutReshapeFunc(Reshape);
InitGL();
Reshape(400, 400);
glutTimerFunc(17, Update, 0);
glutMainLoop();
return 0;
}