2

我正在构建一个简单的 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;
}
4

0 回答 0