0

前回の投稿の後、誰かが pBuffers の使用を勧めてくれたので、Google で少し調べてみたところ、pbuffers を使用してオフスクリーン レンダリングを作成するためのクールな例がいくつか見つかりました。nVidia の Web サイトで入手できるいくつかの例では、単純なオフスクリーン レンダリングを行います。これは、pbuffer コンテキストでレンダリングし、ピクセルを配列に読み取り、opengl 関数を DrawPixels に呼び出します。

読み取ったピクセルからテクスチャを作成するために、この例を変更しました。オフスクリーンでレンダリングし、ピクセルを配列に読み取ってから、この colorbit 配列でテクスチャを初期化します。しかし、これは私には非常に冗長に見えます-画像をレンダリングし、グラフィックカードメモリからメモリ(アレイ)にコピーし、後でグラフィックカードにコピーして画面に表示しますが、別の方法で表示しますレンダリング コンテキスト。レンダリングされたテクスチャを表示するためだけに作成しているコピーはちょっとばかげているように見えるので、glCopyTexImage2D() を使用して別のアプローチを試みましたが、残念ながら機能しません。コードと説明を表示します。

mypbuffer.Initialize(256, 256, false, false);

- false の値は、共有コンテキストと共有オブジェクトです。この素晴らしいグラフィックカードがサポートしていないため、それらは誤りです。

次に、ブレンディングと GL_TEXTURE_2D を有効にするために、通常の初期化を実行します。

    CreateTexture();
    mypbuffer.Activate();

        int viewport[4];
        glGetIntegerv(GL_VIEWPORT,(int*)viewport);
        glViewport(0,0,xSize,ySize);


        DrawScene(hDC);

        //save data to texture using glCopyTexImage2D
        glBindTexture(GL_TEXTURE_2D,texture);

        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                         0,0, xSize, ySize, 0);
        glClearColor(.0f, 0.5f, 0.5f, 1.0f);                // Set The Clear Color To Medium Blue
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glViewport(viewport[0],viewport[1],viewport[2],viewport[3]);
        // glBindTexture(GL_TEXTURE_2D,texture);
        first = false;
        mypbuffer.Deactivate();

- DrawScene 関数は非常に単純です。三角形と四角形をレンダリングするだけで、オフスクリーンでレンダリングされるはずです (希望)。CreateTexture() は、空のテクスチャを作成します。前に説明した方法でテストされ、機能するため、機能は機能するはずです。

この後、メインループで次のことを行います。

            glClear(GL_COLOR_BUFFER_BIT);
            glBindTexture(GL_TEXTURE_2D,texture);

            glRotatef(theta, 0.0f, 0.0f, 0.01f);
            glBegin(GL_QUADS);
            //Front Face
            glTexCoord2f(0.0f, 0.0f);
            glVertex3f(-0.5, -0.5f,  0.5f);
            glTexCoord2f(1.0f, 0.0f);
            glVertex3f( 0.5f, -0.5f,  0.5f);
            glTexCoord2f(1.0f, 1.0f);
            glVertex3f( 0.5f,  0.5f,  0.5f);
            glTexCoord2f(0.0f, 1.0f);
            glVertex3f(-0.5f,  0.5f,  0.5f);
            glEnd();
            SwapBuffers(hDC);

            theta = 0.10f;
            Sleep (1);

最終結果は、背景が青色のウィンドウだけで、実際には何もレンダリングされていません。なぜこれが起こっているのですか?私のグラフィック カードは拡張子 wgl_ARB_render_texture をサポートしていませんが、glCopyTexImage2D() を呼び出すときは問題ありませんか?

私のカードもFBOをサポートしていません

4

2 に答える 2

2

あなたがしなければならないことは、2つのOpenGLコンテキストを「接続」して、PBufferコンテキストのテクスチャがメインのレンダリングコンテキストにも表示されるようにすることです。あなたが探す必要がある用語は「ディスプレイリストの共有」です。WindowsではwglShareLists、を使用してコンテキストをさかのぼって接続します。X11およびMacOS Xでは、コンテキストの作成時に共有するコンテキストのハンドルを指定する必要があります。

まったく異なる可能性と同様に機能することは、PBufferで同じコンテキストを再利用することです。OpenGLレンダリングコンテキストは、最初に作成されたドローアブルだけでなく、互換性のある設定のドローアブルでも使用できることは、ほとんど知られていない事実です。したがって、PBufferがメインウィンドウのピクセル形式と一致する場合は、レンダリングコンテキストをメインウィンドウから切り離して、PBufferにアタッチできます。もちろん、メインウィンドウのデバイスコンテキスト/ドローアブルへの低レベルのアクセスが必要です。これは通常、フレームワークの背後に隠されています。

于 2012-05-29T10:44:31.063 に答える
0

OpenGL実装がフレームバッファオブジェクトをサポートしているかどうかを確認する必要があります。これらのオブジェクトはレンダリングターゲットになり、テクスチャをカラーバッファとしてアタッチして、実際にテクスチャに直接レンダリングすることができます。

これが進むべき道であるはずです、さもなければあなたの方法が代わりです。

于 2012-05-29T08:36:02.053 に答える