編集:いくつかのエラーチェックコードを追加し、glAccum(..)を実行するとエラー「1282」がスローされることを発見しました
Edit2:まったく同じコードを別のコンピューターで試しましたが、そこでは完全に機能します。
Edit3:'Solution' ATI HD4xxx以上のカードは、蓄積バッファをサポートしなくなりました:*(
そのため、HD4850および最新のドライバーを搭載したWindows764ビットでは動作しません。Intelシリーズ4IGPを搭載したWindows732ビットでは動作します。(GL_ACCUM_RED_BITS = 16)。また、正確な仕様がわからないLinuxベースのマシンで実際にすばやく試してみましたが、そこでも機能しました。だから私はそれが私のコンピュータの何かと本当に関係があると思います:(。私は何を知っているのかわからないので、どんなヒントも歓迎します。
これが元の質問です。
glAccumを使用してDOF効果を生成しようとしていますが、glAccumの呼び出しは効果がないようです。問題を単純なテストケースに減らしました。forループで、x軸に沿っていくつかの球を変換します。ご覧のとおり、カラーバッファデータをアキュムレーションバッファにコピーしようとすると、エラーが報告されます。
さらに、累積バッファで使用可能な赤のビット数を確認すると、結果は0になります。これは、初期化されていないことを意味しますか?!
私はこのように表示モードを設定しました:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH);
glClearAccum(0.0, 0.0, 0.0, 0.0);
したがって、蓄積バッファが使用可能である必要があります。
私の表示方法は次のようになります。
void display(void)
{
int i;
GLint test[1];
float weigth = 1.0/(float)apertureSamples;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
HandleKeyboardInput();
glLoadIdentity();
UpdateCamera();
glClear(GL_ACCUM_BUFFER_BIT);
glGetIntegerv(GL_ACCUM_RED_BITS, test);
//No errors here but the number of red bits is 0!?
for(i = 0; i < apertureSamples; i++)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(10*i, 0, 0);
DrawScene(); //draw a couple of spheres
glPopMatrix();
//Still no errors here
glAccum(GL_ACCUM, weigth);
//If I check for errors here I get error 1282
glFlush();
}
glAccum(GL_RETURN, 1.0);
glutSwapBuffers();
}
球のぼやけた軌跡が右に移動するのが見えると思いますが、そうではありません。代わりに、forloopの最後の反復(すべての球がx軸上で10 * appertureSamplesによって変換されます)のみが表示されます。
glAccumが何かを行っているかどうかをテストするために、weigth変数を0.00001に変更しました。これは、各フレームが非常に「薄く」描画されることに影響するはずです(私の英語の語彙はここに残されています)。しかし、これは何の影響も及ぼさないようです。次に、glAccum(GL_RETURN、1.0)をgl_Accum(GL_RETURN、0.0001);に変更しました。これも何もしませんでした(ただし、出力画像全体を薄くする必要がありました。
http://glprogramming.com/red/chapter10.htmlから、DOFとJITTERのすべての手順を実行しましたが、不足しているものが見つかりません。誰かヒントはありますか?
(ところで、私はRadeaon HD4850GPUを搭載したWindows7コンピューターでこれを行っています)。