私は、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;
}