私は最初のFBOにレンダリングされたOpenGLテクスチャを持っていて、その輝度を編集し、2番目のFBOにレンダリングし、それをスクリーンに描画する必要があります。OpenGL:FBOへのレンダリング時にサポートされているテクスチャコンバイナ機能はありますか?
テクスチャを(輝度を変更せずに)2番目のFBOにレンダリングし、それを画面に描画すると、正しく表示されます。
私が描いている間、私は明るさの調整を適用する場合
..私は、ECC、変更されたコントラスト、黒または白の質感のような間違った出力を得る(glTexEnv
のようなテクスチャ合成機能を使用して)レンダリング、テクスチャの明るさを編集しようFBOの代わりに画面上に表示され、うまく動作します。明るさは予想どおりに変更されます。
私の質問は、glTexEnv
のようなテクスチャ結合機能を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);
私は単にシェーダを使用していませんでした、ハードウェアでサポートされていますそれらが存在することを知っている:-)私は趣味としてのみプログラムし、これは私がOpenGLを使用する初めての1つです。私は独学です。とにかく、数時間前に私はシェーダの存在を発見しました。そして、私は現在、 "OpenGLシェーディング言語"の本を読んでいます。私はそれを理解しようとしています。その後、シェーダを使用するソリューションを実装しようとします。私がここに来ていないようなものは1つだけです...シェーダを使用すると、FBOからテクスチャを読み込み、修正してFBOにレンダリングすることが可能ですか?私はバックバッファに直接描画する例しか見つけません。 – Andrea3000
シェイダーと一緒に行くとコンバイナーは古いですし、シェイダーよりも機能が劣ります...シェーダー(実際にはフラグメントシェーダー)を使用すると、フレームバッファー(バックバッファー)またはカスタムFramebufferオブジェクトに書き込むことができます。同じシェーダー内の同じテクスチャ(バッファ)を読み書きすることはできません。ここに1つのアイデアがあります:FBOを書いて(描画する)、テクスチャを設定し、シェーダを設定する...画面に全画面の四角形を描画して、フレームバッファ(テクスチャ)に結果を返します – fen
どうもありがとうございました!それは素晴らしい作品です! – Andrea3000