2012-05-25 26 views
5

OpenGLではテクスチャに何かをレンダリングできるようにしたいので、何度もレンダリングすることなく、いつでも使いこなすことができます。このウェブサイトhereは、FrameBufferを使用せずに、私にそれを行うためのガイドラインを与えました。この古いマシンはそれをサポートしていないので、互換性の問題のためにFrameBufferオブジェクトではしたくありません。テクスチャを作成し、シーンをレンダリングするいくつかのコードを実行した後、テクスチャをレンダリングするクワッドを作成します。唯一の問題は、テクスチャが "Alpha Mask"のようにレンダリングされていることです。つまり、Alpha Valueを考慮に入れて、常に同じ色で四角形を維持しながら、ピクセルの透明度を変更するように見えます。ここで私がこれまで行ってきたいくつかのコードは次のとおりです。OpenGL - テクスチャへのレンダリング

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(); 
+0

レンダリング可能なサーフェスをFrameBufferオブジェクトとして参照するようにテキストを編集してください。フレームバッファだけでなく、誤解を招くこともあります。 – Ani

+0

完了。注目してくれてありがとう。 – filipehd

+0

レンダリング時にブレンドされているようです。これはあなたの意図ですか?実際にレンダリングされるものを見るためにswapBuffersを呼び出しましたか? – Ani

答えて

4

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

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

0

FBOsが利用可能であった前の方法は、FBOsを必要とし、テクスチャへのバッファ(see glReadBuffer)(see glCopyTexImage2Dからピクセルをコピーする。テクスチャーに直接レンダリング代替バッファ(see glDrawBuffer(GL_AUX0)をレンダリング使用することであった。

+0

Ben Voigt、あなたの答えをありがとう、私は月曜日にそれを試してみよう。 – filipehd

+0

補助バッファはFBOよりもサポートされていません。最も広くサポートされている方法は、レンダリングターゲット(メインのOpenGLコンテキストでオブジェクトを共有する)としてPBufferデバイスコンテキスト/レンダリングコンテキストを使用し、レンダリングされた画像をテクスチャにコピーすることでした。 Googleの "PBufferレンダリングテクスチャ" – datenwolf

+0

datenwolf、あなたの答えに感謝します。私の答えは以下の通りです。興味深い結果が得られました。 – filipehd

関連する問題