0

編集:いくつかのエラーチェックコードを追加し、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コンピューターでこれを行っています)。

4

2 に答える 2

0

GL_ACCUM_RED_BITSがゼロの場合は、累積バッファーがないことを意味します。GL実装は、少なくともソフトウェアでそれをサポートする必要があります。glAccumでのエラーは、蓄積バッファーが存在しないことも示唆しています。

そもそもなぜアキュムレーションバッファを使っているのですか?シェーダー、フレームバッファーオブジェクト、浮動小数点テクスチャを使用して同じ効果を実行できます。また、最新のOpenGL実装とも互換性があります。

于 2011-03-03T17:14:57.907 に答える
0

おそらく蓄積バッファがありません。しかし、とにかくそれは必要ありません。被写界深度効果は、シェーダーを使用して実行されるようになりました。累積バッファ方式では、同じ画像を複数回レンダリングする必要があります。あまり効率的ではありません。Shader Depth of Fieldは後処理効果であり、Zバッファ値を使用してぼかしカーネルのサイズを選択します。アイデアは、現在のフラグメントの周りの値を収集し、Z値によって決定されるぼやけたカーネルサイズによって各隣接フラグメントを追加することです。内側のループを小さく保つために、通常、画像全体をいくつかのカーネルサイズでぼかし、それらを3Dテクスチャのレイヤーに配置します。次に、この3Dテクスチャを使用して、目的のぼかし強度をすばやく取得します。

于 2011-03-03T18:49:23.350 に答える