1

消去機能付きのアプリがあります。たとえば、色付きの画像を開くと、その上にグレースケール レイヤーが追加され、マウスでトップ (グレースケール) レイヤーの部分を消去できます。後で画像をファイルに保存する機能があります。保存用のピクセルが GL_RGB として取得される場合、問題なく動作します:

ここに画像の説明を入力

そして、保存用のピクセルが GL_RGBA として取得される場合、いくつかの問題があります (空白は透明です):

ここに画像の説明を入力

元のバージョンの画像が に描画されframebuffer1、アプリがブラシ ストロークを描画しframebuffer2、グレースケール バージョンの画像が に描画されframebuffer3ます。次に、これらすべてのフレームバッファが描画さmain_framebuffermain_framebuffer、画面に描画されます。消去は と を介して行われglBlendFuncますglBlendFuncseparate。を実行するglReadPixelsと、ピクセルが から読み取られmain_framebufferます。私の問題はどこにありますか?


准将

今、私はそのようにメインフレームバッファに描画します:

glPushMatrix();
glLoadIdentity();
glViewport(0, 0, _width, _height);
glMatrixMode(GL_PROJECTION);
glFrustum(0, _width, 0, _height, 0.1, 100);
glTranslatef(0.0,0.0,-0.5);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, main_framebuffer);
glClearColor(0.93, 0.93, 0.93, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, _width, _height);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, framebuffer1_texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0, _height);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex2f(_width, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex2f(_width, _height);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);

glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ZERO);
glBindTexture(GL_TEXTURE_2D, framebuffer2_texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, _height);
glTexCoord2f(1.0f, 1.0f); glVertex2f(_width, _height);
glTexCoord2f(1.0f, 0.0f); glVertex2f(_width, 0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);

glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
glBindTexture(GL_TEXTURE_2D, framebuffer3_texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, _height);
glTexCoord2f(1.0f, 1.0f); glVertex2f(_width, _height);
glTexCoord2f(1.0f, 0.0f); glVertex2f(_width, 0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_BLEND);

glColorMask (0.0, 0.0, 0.0, 1.0);
glBegin(GL_QUADS);
glColor4f(1.0, 1.0, 1.0, 1.0);
glVertex2f(0.0, oglAukstis);
glColor4f(1.0, 1.0, 1.0, 1.0);
glVertex2f(0.0, 0.0);
glColor4f(1.0, 1.0, 1.0, 1.0);
glVertex2f(oglPlotis, 0.0);
glColor4f(1.0, 1.0, 1.0, 1.0);
glVertex2f(oglPlotis, oglAukstis);
glEnd();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glPopMatrix();

そして、この質問の前半と同じ画像を読み込もうとすると、次のようになります。
ここに画像の説明を入力

そして、それを保存すると、次のようになります。 ここに画像の説明を入力

4

1 に答える 1

3

メイン バッファのアルファ チャネルへの書き込みを無効にする必要があります。

// draw framebuffers 1-3 ...
glColorMask (true, true, true, false);
// render to main buffer ...
glColorMask (true, true, true, true);  // revert to default state
于 2012-10-16T08:10:48.337 に答える