我正在构建一个简单的 3D 游戏引擎,它建立在 OpenGL 之上,用于窗口和 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;
}