0

最初のFBOにレンダリングされたOpenGLテクスチャがあり、その明るさを編集し、2番目のFBOにレンダリングしてから、画面に描画する必要があります。

テクスチャを(明るさを変更せずに)2番目のFBOにレンダリングしてから画面に描画すると、正しく表示されます。

レンダリングされたテクスチャの明るさを編集しようとすると(のようなテクスチャコンバイナ関数を使用してglTexEnv)、すべて黒またはすべて白のテクスチャ、変更されたコントラストなどの間違った出力が得られます。

FBOの代わりに画面に描画しているときに明るさの調整を適用すると、うまく機能します。明るさは期待どおりに変更されます。

glTexEnvだから私の質問は: FBOにレンダリングするときのようにテクスチャコンバイナー関数を使用できますか?

これは、FBOに描画するときに明るさを変更するために使用するコードです(機能しません)。

// "secondFBO" is the FBO I'm intended to render to after brightness regulation.
// "textureId" is the OpenGL texture attached to the first FBO that contains
// the unmodified texture.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, secondFBO);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId);

// apply alpha filter
double t = brightnessValue;     
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
if (t > 1.0f)
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_ADD);
    glColor4f(t-1, t-1, t-1, t-1);
}
else
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_SUBTRACT);
    glColor4f(1-t, 1-t, 1-t, 1-t);
}
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_TEXTURE);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);

// restore previous state
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

// draw on screen
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
// "textureId2" is the texture attached to the second FBO
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureId2);

// ... draw texture ...

glDisable(GL_TEXTURE_RECTANGLE_ARB);
4

1 に答える 1

2

なぜシェーダーを使用しないのですか?コードを書くほうがずっと簡単だと思います

FBOを使用しているということは、シェーダー(少なくともGLSL 1.2がハードウェアでサポートされている)を意味します

于 2012-02-10T09:49:32.957 に答える