消去機能付きのアプリがあります。たとえば、色付きの画像を開くと、その上にグレースケール レイヤーが追加され、マウスでトップ (グレースケール) レイヤーの部分を消去できます。後で画像をファイルに保存する機能があります。保存用のピクセルが GL_RGB として取得される場合、問題なく動作します:
そして、保存用のピクセルが GL_RGBA として取得される場合、いくつかの問題があります (空白は透明です):
元のバージョンの画像が に描画されframebuffer1
、アプリがブラシ ストロークを描画しframebuffer2
、グレースケール バージョンの画像が に描画されframebuffer3
ます。次に、これらすべてのフレームバッファが描画さmain_framebuffer
れmain_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();
そして、この質問の前半と同じ画像を読み込もうとすると、次のようになります。
そして、それを保存すると、次のようになります。