5

OpenGLで何かをテクスチャにレンダリングできるようにしたいので、すべてを再度レンダリングすることなく、必要なときにいつでもそれをさらに使用できます。この Web サイトは、 FrameBufferを使用せずにそれを行うためのガイドラインを提供してくれました。この古いマシンはそれをサポートしていないため、互換性の問題により、FrameBuffer オブジェクトでそれを行いたくありません。テクスチャを作成し、シーンをレンダリングするコードをいくつか実行しました。次に、Quad を作成してテクスチャをレンダリングします。唯一の問題は、テクスチャが「アルファ マスク」のようにレンダリングされていることです。つまり、アルファ値のみを考慮しているように見え、四角形を常に同じ色に維持しながら、ピクセルの透明度を変更しているだけです。これまでに行ったコードは次のとおりです。

void CreateTexture ()
{
    xSize = 512;
    ySize = 512; //size of texture
//new array
    char* colorBits = new char[ xSize * ySize * 3 ];
//texture creation..
    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);
    glTexImage2D(GL_TEXTURE_2D,0 ,3 , xSize,
                 ySize, 0 , GL_RGB,
                 GL_UNSIGNED_BYTE, colorBits);
//you can set other texture parameters if you want
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//clean up
    delete[] colorBits;
}

それで:

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);

そして最後に:

glEnable(GL_TEXTURE_2D);                    // Enable 2D Texture Mapping
        glBlendFunc(GL_DST_COLOR,GL_ONE);               // Set Blending Mode
        glEnable(GL_BLEND);

        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);

DrawScene() 関数は、頂点ごとに異なる色を持つ三角形を上に置いた四角形を単純にレンダリングします。特別なことは何もありません。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT );//| GL_DEPTH_BUFFER_BIT);

glPushMatrix();
//    glRotatef(theta, 0.0f, 0.0f, 1.0f);

glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f,  1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f,  1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f( 1.0f,  1.0f,  1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,  1.0f,  1.0f);
glEnd();

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f,   1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.87f,  -0.5f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(-0.87f, -0.5f);
glEnd();
glPopMatrix();
4

2 に答える 2

4

FBOでオフスクリーンレンダリングもできない人のために、nVidiaのWebサイトで便利に見えるものを見つけました:

http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html

この Web サイトには、基本的に P-buffer の実装を含む「Simple P-Buffer」と呼ばれる 1 つのプロジェクトが含まれています。サンプルのアイデアは、オフスクリーン モードでピクセルを描画したいときに、pBuffer にコンテキストを切り替えることです。通常のレンダリング関数でシーンを描画した後、glReadPixels を使用して、データを pBuffer から符号なしバイト (GLubyte) の配列に読み込みます。その後、もう一度コンテキスト切り替えを行い、画面コンテキストに戻して、glReadPixels を使用して配列からコンテンツを読み取ることができるようにします。

于 2012-05-28T09:44:56.923 に答える
0

FBO が使用可能になる前の方法は、代替レンダー バッファを使用することでした (を参照)。次に、そのバッファ (glDrawBuffer(GL_AUX0)を参照glReadBuffer) からテクスチャにピクセルをコピーします (を参照glCopyTexImage2Dしてください。テクスチャに直接レンダリングするには FBO が必要です。

于 2012-05-25T15:05:01.723 に答える