2012-02-09 5 views
0

私は最初の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); 

答えて

2

これは私がFBO(それが動作しない)に描きながら明るさを変更するために使用するコードですか? は、私はコードを書くことがはるかに容易になると思い

あなたはFBOを使用していて、それはつまりシェーダ - 少なくとも1.2 GLSLが、私はしませんでしたので

+0

私は単にシェーダを使用していませんでした、ハードウェアでサポートされていますそれらが存在することを知っている:-)私は趣味としてのみプログラムし、これは私がOpenGLを使用する初めての1つです。私は独学です。とにかく、数時間前に私はシェーダの存在を発見しました。そして、私は現在、 "OpenGLシェーディング言語"の本を読んでいます。私はそれを理解しようとしています。その後、シェーダを使用するソリューションを実装しようとします。私がここに来ていないようなものは1つだけです...シェーダを使用すると、FBOからテクスチャを読み込み、修正してFBOにレンダリングすることが可能ですか?私はバックバッファに直接描画する例しか見つけません。 – Andrea3000

+0

シェイダーと一緒に行くとコンバイナーは古いですし、シェイダーよりも機能が劣ります...シェーダー(実際にはフラグメントシェーダー)を使用すると、フレームバッファー(バックバッファー)またはカスタムFramebufferオブジェクトに書き込むことができます。同じシェーダー内の同じテクスチャ(バッファ)を読み書きすることはできません。ここに1つのアイデアがあります:FBOを書いて(描画する)、テクスチャを設定し、シェーダを設定する...画面に全画面の四角形を描画して、フレームバッファ(テクスチャ)に結果を返します – fen

+0

どうもありがとうございました!それは素晴らしい作品です! – Andrea3000

関連する問題