レンダリング可能なオブジェクトごとに異なる描画モード (Photoshop にあるもの) を設定できるシステムがあります。現在、私がしていることは次のとおりです。
- 通常、レンダリング可能なオブジェクトを FBO B にレンダリングします。
- ブレンディング モード シェーダー プログラム、FBO C をアタッチし、FBO B からのカラー アタッチメントを FBO A からのカラー アタッチメントとブレンドします (FBO A には以前の描画の最終結果が含まれています)。
- FBO C からの結果を FBO A にブリットし、残りのパイプラインに進みます。
これは問題なく動作しますが、現在このピンポンのために浪費されているフレーム レートをいくらか節約したいと思います。デフォルトでは、ピクセルへの書き込み時に同時にピクセルを読み取ることができないため、読み書きするテクスチャ?理想的には、私がやりたいことは、ステージ 1 でジオメトリを FBO A にレンダリングし、FBO A のカラー アタッチメント テクスチャと入力マテリアル テクスチャのブレンドを処理することです。
明確にするために、ここに例を示します。
以前にレンダリングされたすべてのジオメトリが FBO A に蓄積されていると仮定しましょう。そして、ブレンドする必要がある新しいレンダリングされたオブジェクトはそれぞれ、(上で書いたように) FBO B にレンダリングされます。次に、ブレンド パス (FBO C に描画されます) で、次のシェーダーが使用されます(ここでは暗くブレンドしています):
uniform sampler2D bottomSampler;
uniform sampler2D topSampler;
uniform float Opacity;
// utility function that assumes NON-pre-multiplied RGB...
vec4 final_mix(
vec4 NewColor,
vec4 BaseColor,
vec4 BlendColor
) {
float A2 = BlendColor.a * Opacity;
vec3 mixRGB = A2 * NewColor.rgb;
mixRGB += ((1.0-A2) * BaseColor.rgb);
return vec4(mixRGB,BaseColor.a+BlendColor.a);
}
void main(void) // fragment
{
vec4 botColor = texture2D(bottomSampler,gl_TexCoord[0].st);
vec4 topColor = texture2D(topSampler,gl_TexCoord[0].st);
vec4 comp = final_mix(min(botColor,topColor),botColor,topColor);
gl_FragColor = comp;
}
ここ :
均一なサンプラー2D ボトムサンプラー; ●FBO テクスチャー付属。
均一サンプラー2D topSampler; ・FBO Bテクスチャー付属
平面ジオメトリ オブジェクトのみを使用します。
このシェーダーからの出力は、次の進化のために FBO A にブリットされる FBO C テクスチャ アタッチメントです。