6

OpenGLフレームバッファオブジェクトを使用して、サードパーティのプログラマーが望む目的でOpenGLプログラムで使用できるテクスチャを作成する汎用ユーティリティ関数を作成したいと思います。

引数の賭けについて、関数は次のようになります。

void createSpecialTexture(GLuint textureID)
{
    MyOpenGLState state;
    saveOpenGLState(state);
    setStateToDefault();
    doMyDrawing();
    restoreOpenGLState(state);
}

が正しく動作し、サードパーティの開発者が行う可能性のある他のことに影響を与えないようにするには、、、およびどのように見えるMyOpenGLState必要 がありますか?saveOpenGLState(state)setStateToDefault()restoreOpenGLState(state)doMyDrawingdoMyDrawing

私を悩ませてきた問題は、OpenGLには多くの暗黙の状態があり、すべてをキャプチャしているのかどうかわからないことです。

更新:私の主な関心事はOpenGL ES 2.0ですが、もっと一般的に質問したいと思いました

4

3 に答える 3

2

テクスチャのレンダリングにフレームバッファオブジェクトを使用しないでください。むしろ、新しいEGLContextとEGLSurfaceを作成します。次に、を使用eglBindTexImageしてEGLSurfaceをテクスチャに変換できます。doMyDrawingこのようにして、状態がメインのglコンテキストを汚染しないことが保証されます。その逆も同様です。

于 2012-09-18T16:44:45.303 に答える
1

保存と復元に関しては、glPushAttrib非常glPopAttribに遠くまで行きます。

ただし、GLをデフォルトの状態に復元することはできません。ただし、doMyDrawing()既知の状態のみを使用および/または変更するため、必要な値に設定するだけで済みます。

于 2012-09-18T12:33:46.303 に答える
0

これは、あなたが何をするかに大きく依存しますが、基本的には、この関数で変更したすべて(すべての状態)doMyDrawing();を復元する必要があります。内部で何が起こっているかを見なければ、何を復元しなければならないかを推測することは不可能です。doMyDrawing();

投影またはモデルビューマトリックスの変更が内部で行われる場合は、最初に両方とマトリックスをdoMyDrawing()押して、描画後にそれらを復元することを忘れないでください。変更するその他の状態は、プッシュアンドポップと正しい属性にすることができます。doMyDrawing()内でバインドする可能性のあるテクスチャ、FBO、PBOなどのバインドを解除することも忘れないでください。GL_PROJECTIONGL_MODELVIEWglPushMatrixglPopMatrixglPushAttrib

于 2012-09-18T13:43:44.693 に答える