2011-12-31 16 views
1

物理的に正確なモーションブラーを実際に中間の位置でレンダリングして実装するには、これを正しく行うために特別なブレンド機能が必要です。 Additive Blendingは黒い背景でしか機能せず、標準的な "transparency"関数(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)はサンプル数が少ないと見えるかもしれませんが、物理的には不正確です。カスタムブレンド関数(OpenGL)の定義

私が必要とする機能は、フラグメントをカバーするサンプルの数に応じて、元の色と目的の色の加重平均である色を生成する必要があります。しかし、サンプル間のレンダリングの違いをよりよく説明するためにこれを一般化することができます。ぼかしされたオブジェクトをn回レンダリングするとします。色を3ベクトルとして扱い、DDEST - SRCとする。各レンダリングでソースカラーにD/nを追加します。

これは固定機能のパイプラインを使用して行うことができますか?少なくとも私にとっては、The glBlendFunc referenceはかなりわかりにくいです。これは簡単に行うことも、不可能なことも考えられます。アルファベットを1/nに設定したいと思うようです。私が説明した振る舞いについては、GL_DEST_MINUS_SRC_COLORオプションが必要ですか?

私はまた、関連する質問があります。この段階でこのブレンド処理が実行されますか?フラグメントシェーダプログラムの前後に?フラグメントシェーダーのソースとターゲットの色にアクセスできますか?

私が欲しいものを達成する1つの方法は、蓄積バッファーを使用することです。私はそれが記憶と詰め物の無駄であるので、これをしたくありません。

+2

ブレンドシェーダがないため、固定機能パイプラインでこれを行う必要があります。ブレンドはフラグメントシェーディング後にも発生します。パイプラインの他のステージでは、ピクセルの値を知ることはできません。 – pmr

+0

いくつかの考えの後で:私はあなたがBlendFuncに州をどのように置くことができるかわかりません。通常、BlendEquationで調整することができますが、パイプラインのブレンド部分には 'レンダリング回数 'の概念がないため、ここでは役立たないでしょう。しかし、ユニフォームの助けを借りて正しいアルファ値を計算するフラグメントシェーダを使うことができます。 – pmr

+0

自分でフラグメントプログラムで実行できませんでしたか?入力テクスチャをテクスチャユニット1〜8(またはあなたのカードの最大値が何であれ)に入れてそこにブレンドすることができます。 – user1118321

答えて

1

私のエフェクトを実装するために使用したソリューションは、フラグメントシェーダからテクスチャとしてアクセスする追加のブレンドとレンダリングターゲットの組み合わせです。