0

を実行しているラップトップ ユーザーが、ATI Radeon HD 5800 Series彼のマシンで実行されている私の 2D ゲームのビデオを見せてくれました。glScissorコードが意図したとおりに動作していないように見えました (他の非常に多くのコンピューターで動作しているにもかかわらず)。

画面上の特定の四角形にレンダリングを制限したいときはいつでも、特定の四角形に対してSetClip関数を呼び出すかRectangle.Empty、はさみをリセットします。

public void SetClip(Rectangle theRect)
{
    if (theRect.IsEmpty)
        OpenGL.glDisable(OpenGL.EnableCapp.ScissorTest);
    else
    {
        if (!OpenGL.glIsEnabled(OpenGL.EnableCapp.ScissorTest))
            OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

        OpenGL.glScissor(theRect.Left, myWindow.clientSizeHeight - theRect.Bottom,
           theRect.Width, theRect.Height);
        CheckError();
    }
}

このアプローチは間違っていますか?たとえば、glEnable/はorglDisableが必要で、呼び出した順序で実行されることを保証する必要があると感じています。glFlushglFinish

4

1 に答える 1

2

私はドライバーのバグにお金をかけます。あなたのコードは問題ないようです。

これを変更することをお勧めする唯一のこと:

if (!OpenGL.glIsEnabled(OpenGL.EnableCapp.ScissorTest))
       OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

ただに

OpenGL.glEnable(OpenGL.EnableCapp.ScissorTest);

glEnable の状態を変更するのは事実上無料であるため、そのテストを行うことはマイクロ最適化です。実際、冗長に設定することによってオーバーヘッドが発生するため、最初のテストにはglIsEnabledおそらく同じくらいのコストがかかります。しかし、一部のドライバーは によって報告される内容にバグがある可能性があるglIsEnabledため、別の潜在的なエラー ソースを削減するためにそれを削除します。

glEnable / glDisable には、呼び出した順序で実行されることを保証するために glFlush または glFinish が必要になる可能性があると感じています。

いいえ、そうではありません。実際、ほとんどのプログラムでは glFlush と glFinish は必要ありません。ダブル バッファを使用している場合は、まったく必要ありません。

于 2013-07-03T19:20:58.713 に答える