前回の投稿の後、誰かが 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をサポートしていません