問題タブ [glblendfunc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 部分的な透過性 (半透明性) を使用してテクスチャに Opengl をレンダリングし、それを画面にレンダリングする
これが尋ねられた場所をいくつか見つけましたが、まだ良い答えを見つけていません。
問題: テクスチャにレンダリングしたいのですが、そのレンダリングされたテクスチャを、テクスチャへのレンダリングのステップをスキップして画面に直接レンダリングした場合と同じように画面に描画したいと考えています。現在、ブレンド モード glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) を使用しています。私もglBlendFuncSeparateを使って遊んでいます。
部分的に透明な重なり合うアイテムをこのテクスチャにレンダリングできるようにしたいと考えています。ブレンド関数が現在、アルファに基づいて RGB 値を台無しにしていることを知っています。「事前に乗算されたアルファ」を使用するという漠然とした提案を見たことがありますが、それが何を意味するかについての説明は貧弱です。私は Photoshop で png ファイルを作成します。それらには半透明ビットがあり、TGA のようにアルファ チャネルを個別に簡単に編集することはできません。PNG の方が便利ですが、必要に応じて TGA に切り替えることもできます。
今のところ、この質問のために、画像を使用していないと仮定します。代わりに、アルファ付きのフルカラー クワッドを使用しています。
シーンをテクスチャにレンダリングしたら、そのテクスチャを別のシーンにレンダリングする必要があります。また、部分的な透明度を想定してテクスチャをブレンドする必要があります。ここで物事がバラバラになります。前のブレンディング手順では、アルファに基づいて RGB 値を明確に変更しました。アルファが 0 または 1 の場合は再度変更しても問題ありませんが、その間にある場合は、部分的に半透明のピクセルがさらに暗くなります。
ブレンドモードで遊んでいて、運がほとんどありませんでした。私ができる最善の方法は、次の方法でテクスチャにレンダリングすることです。
glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) を使用して複数回レンダリングすると、適切な色に近づくことがわかりました (重複しない限り)。しかし、それは完全ではありません (次の画像でわかるように、緑/赤/青のボックスが重なっている部分が暗くなるか、アルファが蓄積されます。(編集: 画面部分へのレンダリングで複数の描画を行うと、テクスチャに 1 回レンダリングすると、アルファ蓄積の問題がなくなり、機能しますが、なぜ?! 同じテクスチャを画面に何百回もレンダリングして適切に蓄積する必要はありません)
問題の詳細を示すいくつかの画像を次に示します (複数のレンダー パスは基本的なブレンディング (GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA) を使用しており、テクスチャ レンダリング ステップで複数回レンダリングされます。右側の 3 つのボックスは、100% の赤、緑、または青でレンダリングされます。 (0-255) ただし、青の 50%、赤の 25%、緑の 75% のアルファ値:
だから、私が知りたいことの内訳:
- ブレンド モードをX ?に設定しました。
- シーンをテクスチャにレンダリングします。(おそらく、いくつかのブレンド モードで、または複数回レンダリングする必要がありますか?)
- ブレンド モードをYに設定しました。
- 既存のシーンの上にテクスチャを画面にレンダリングします。(多分、別のシェーダーが必要ですか? テクスチャを数回レンダリングする必要があるのでしょうか?)
望ましい動作は、そのステップの最後に、最終的なピクセル結果が、これを実行した場合と同じになることです。
- ブレンドモードを次のように設定しました: (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
- シーンを画面にレンダリングします。
そして、完全を期すために、ここに私の最初の素朴な試み(通常のブレンディングのみ)を含むコードの一部を示します。
シーンをセットアップするために使用しているコードは次のとおりです。
シーンをレンダリングするコード:
そして、ここに私のスクリーンドローがあります:
*編集: フレームバッファのセットアップ/ティアダウン コード:
そして私のクリアスクリーンコード:
ruby - Opengl、Ruby、glBlendFunc: 透明な画像を不透明であるかのように重ねて配置します
glBlendFunc が私の問題を解決するための優れた機能であるかどうかはわかりませんが、必要になると思います! これが私の問題です:
右側に二本の松の木が映っているのがわかりますか?私はそのようなものが欲しいです:
次に、不透明な画像と同じ表示を行う方法が必要ですが、透明な画像を使用します。glBlendFunc に特別な組み合わせがありますか、それとも他の方法で進める必要がありますか?
opengl - libgdx - ブラシ線画のblendFunc? (添加・無添加混合)
2 点間の線の各ステップの各ピクセルでフレーム バッファにスプライトを描画していますが、ブレンドに問題があります。
私は現在使用しています:
(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
次に、シェーダーで次のことを行います。
ただし、赤と緑の星を見ると、アルファが (0,1) の間隔で発生する「加算ブレンディング」が見られます。
加算ブレンドを使用しないと、次の 3D 効果が発生します。
似たような色を加法ブレンドする方法はありますが、色が一致しない場合は避けてください。
次のようになります。