4

テクスチャにレンダリングしてから同じ画像を描画すると、すべてが暗くなるようです。この画像を取得するには:

http://img24.imageshack.us/img24/8061/87993367.png

左上の正方形を色付き(1, 1, 1, .8)でテクスチャにレンダリングし、次にそのテクスチャをレンダリングし、中央の正方形 (同じ色) を別のテクスチャにレンダリングし、最後にそのテクスチャと右下の正方形 (同じ色) を画面にレンダリングします。

ご覧のとおり、テクスチャにレンダリングするたびに、すべてが少し暗くなります。

Render-to-Texture コードは次のようになります: (iPhone で OpenGL ES を使用しています)

// gen framebuffer
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

// gen texture
GLuint texture;
glGenTextures(1, &texture);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);

// hook it up
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES))
   return false;

// set up drawing
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glViewport(0, 0, Screen::Width, Screen::Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Screen::Width, 0, Screen::Height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4f(1, 1, 1, 1);

// do whatever drawing we'll do here
Draw();

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

ここで私が間違っていることはありますか?それを理解するためにさらにコードが必要ですか?ここで何が起こっているのでしょうか?

4

1 に答える 1

6

私は推測しています:

最初のテクスチャを描画すると、RGB チャネルとアルファ チャネルで 204 (0.8 * 255) になります。2 回目に描画すると (GL_BLEND が有効になっていると思われます)、ライト グレーの 204 RGB と 80% のアルファが得られ、ミディアム グレーになります。

解決策:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)色を使用して事前に乗算します。

于 2009-08-18T18:40:22.503 に答える