2

私は、OpenGL の上に構築された単純な 3D ゲーム エンジン、およびウィンドウと I/O、GLUT を構築中です。エンジンにモーション ブラー オプションをビルドしようとすると、OpenGL 累積バッファで問題が発生しました。基本的に、これは私のためにこれを行うことになっているコードの小さなブロックです:

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

最初にこのコード ブロックをRender()メソッドに埋め込んで試してみましたが、一部のピクセルしか表示されない破損したビューが表示されました。そこで、コードを見つけた Web サイトの残りのソースで試してみました。私はまだ同じ問題を抱えています。以下は問題の画像です。

蓄積バッファの出力。

次に、アキュムレーション バッファ部分 (モーション ブラーを実現するための 3 つのライン) を取り出したところ、次のようになりました。

見た目は正しいが、期待どおりのモーション ブラーがない

もちろん、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