8

私はC++でウィンドウとLinuxの両方にオフスクリーンOpenGLレンダラーを実装するタスクを持っています。LWJGLlibを使用してJavaですでに書かれたそのようなバージョンがあります。そこではPBufferオブジェクトを使用しました。 LWJGLのネイティブソースで行ったのと同じように完全なPBuffer作成ロジックを再実装します。次に、StackOverflow.comでこの投稿を読み、標準のコンテキスト作成を使用することをお勧めします。たとえば、 GLFW(クロスプラットフォーム)を使用します。実際のウィンドウを作成しないでください。それは正しい方法ですか?このような場合にPbufferを使用することとの長所と短所は何ですか?

更新: フレームのレンダリングにFBOを使用していることを強調したいので、ここでの問題は、オフスクリーンモードでレンダリングする方法ではなく、WindowsとLinuxOSの両方でウィンドウなしのコンテキストを作成する方法です。

4

3 に答える 3

6

PBufferを使用せず、代わりにフレームバッファオブジェクト(FBO)を使用することを強くお勧めします。FBOは、コンテキストスイッチを必要とせず、他にもいくつかの利点があるため、はるかに優れたパフォーマンスを提供します。

LWJGLはFBOをサポートしますが、GLFWはOpenGLのクロスプラットフォームセットアップ用であり、レンダリング用ではありません。クロスプラットフォームのFBOを便利に使用するには、GLFWの上にOGLplusなどのライブラリを使用することをお勧めします。テクスチャへのレンダリングの例については、ここを参照してください。

于 2013-01-10T08:51:51.903 に答える
2

Simple DirectMedia Layer(SDL)ライブラリは試してみる価値があります。クロスプラットフォームのOpenGLコンテキストの作成を簡素化し、オフスクリーンレンダリングにメモリサーフェスを使用する機能を備えています。

追加で行う必要があるのは、プラットフォームに応じて、さまざまな場所からのOpenGLヘッダーとSDLヘッダーを含めることだけです。これは、単純なプリプロセッサディレクティブを使用して実行できます。

于 2013-01-10T10:27:35.040 に答える
0

コンテキストを作成するクロスプラットフォームの方法がないことを私が知っている限り、独自の抽象化を作成してから、プラットフォームごとに実装する必要があります。

Windowsでは、次のコードを使用して、バックグラウンドスレッドでコンテンツの読み込みを行うための2番目のコンテキストを作成しました(このプログラムはGLFWを使用しましたが、それは重要ではありません)。

void Program::someFunction()
{
    HDC hdc = wglGetCurrentDC();
    HGLRC hglrc = wglGetCurrentContext();
    HGLRC hglrc_new = wglCreateContext(hdc);
    wglShareLists(hglrc, hglrc_new);
    loadThread = boost::thread(&Program::loadFunc, this, hdc, hglrc_new);
}

/**
 * Imports all our assets. Supposed to run in its own thread with its own OpenGL context.
 * @param hdc The current device context.
 * @param hglrc A OpenGL context thats shares its display list with the main rendering context.
 */
void Program::loadFunc(HDC hdc, HGLRC hglrc)
{   
    wglMakeCurrent(hdc, hglrc);

        //Do stuff...

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hglrc);
}
于 2013-01-10T10:03:45.213 に答える