腐败的累积缓冲输出

时间:2013-03-13 15:40:33

标签: c++ opengl glut

我正在构建一个基于OpenGL构建的简单3D游戏引擎,以及用于窗口化和I / O的GLUT。尝试在引擎中构建运动模糊选项时,我遇到了OpenGL累积缓冲区的问题。从本质上讲,这是我应该为我做的一小段代码:

glAccum(GL_MULT, 0.99f);
glAccum(GL_ACCUM, 1.0f - 0.99f);
glAccum(GL_RETURN, 1.0f);

我首先在我的Render()方法中植入了这段代码,但它显示了一个看似腐败的视图,其中只有少数几个像素可见。所以,我然后从我找到代码的网站的其余源代码尝试了它。我仍然遇到同样的问题。以下是该问题的图片:

Output of accumulation buffer.

然后,我刚拿出累积缓冲区部分(应该实现运动模糊的三条线),这就是我得到的:

Correct looking, but no motion blur as expected

当然,因为我删除了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;
}

0 个答案:

没有答案