1

OpenGL を使用して 2D ゲームを作成しています。最近、Framebuffer オブジェクトを実装しようとしましたが、ブレンドに関していくつか問題があります。

FBO を作成しています (GL_RGBA をフォーマットとして使用)。FBO にレンダリングするときは、まず完全に透​​明な黒にクリアし、GL_BLEND を無効にします。次にテクスチャを描画し、GL_BLEND を再度有効にします。FBO テクスチャを描画するときは、GL_SRC_ALPHA と GL_ONE_MINUS_SRC_ALPHA をそれぞれソース ピクセルとデスティネーション ピクセルとして、ブレンディング関数として使用します。テクスチャ付きのクワッドとしてレンダリングしています。白いピクセルが透明に見えるため、これは正しく機能しません。さまざまなブレンド関数値を試してみましたが、試したすべてに問題がありました。ブレンディングがどのように機能するかを完全には理解していないので、これに頭を悩ませるのは難しい. 多分私はここで明らかな何かを見逃していますか?

これが現在の様子の画像です。ボタンが強調表示されると、ボタンの周りが光るはずですが、代わりにその周りのピクセルが透明に見えます: http://i.snag.gy/RnV4s.jpg

画像には 2 つのボックスのテキストも表示されています。上の 1 つは、FBO なしで通常どおりに描画されます。テクスチャも FBO なしで正常にレンダリングされるため、フレームバッファ コードのどこかに問題があることがわかります。

「RenderTarget」クラスをペーストビンに貼り付けました (FBO ではなくレンダーターゲットと呼ぶことに慣れています): http://pastebin.com/dBXgjrUX

これは私がそれを使用する方法です:

RT->Begin();
// draw stuff
RT->End();
RT->Draw();

誰かが私を助けることができますか?私の問題についてさらに情報が必要な場合はお知らせください。

編集:起動時に設定したOpenGLのプロパティは次のとおりです。

// Initialize shaders
shaderManager.InitializeStockShaders();

// Set some OpenGL properties
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_SMOOTH);
glAlphaFunc(GL_GREATER, 0.0f);

// Enables/disables
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_DITHER);
glDisable(GL_LIGHTING);
4

1 に答える 1

2

ソースコードを提供していないため、問題が正確に何であるかを伝えるのは少し難しくありません。残念ながら、潜在的なトラブルメーカーがいくつかあります。

最初に、ボタンの周りにグローを描きたいと伝えました。すべてのボタンが FBO に描画され、UI オーバーレイにマージされていると思います。Glow は、何かをブレンドしたいように聞こえるので、おそらくブレンドを有効にして FBO に描画したいと思うでしょう。

次に、深度バッファの問題に注意してください。ブレンディングと深度バッファリングには、独特の相互作用があります。あなたの場合、深度テストとFBOへの深度書き込みを無効にすることをお勧めします(または、FBOへの深度バッファアタッチメントをまったく使用しないでください)。他のボタンの描画を妨げないように、光るボタンを最後に描画します。また、グローがゼロ以外のアルファ値で出てくることを確認する必要があります。そうしないと、透明にブレンドされます。これは、シェーダーまたはテクスチャ環境で制御するものです (使用するものによって異なります)。


更新 1:

あなたの FBO クラスは、バインドされたフレームバッファにアタッチされたテクスチャがそれ自体にバインドされてはならないことを適切に保証していません。ただし、添付コードをバインドに移動すると、テクスチャも適切にバインド解除されるため、簡単に修正できます。編集したペーストビンhttp://pastebin.com/1uVT7VkRを参照してください(おそらくいくつか見落としています)。

于 2012-06-18T13:19:16.917 に答える