斑鳩のボス警告のアレ
原理的にどうやればいいか,頭の中にはあったんですが,
実際にやった事は無かった(というより使う機会が無かった)反転合成.
実際にやってみると,かなりカッコエェ...
わー,何かいろんなところで使いたくなってきた.
ところで,最近,プログラムっぽい話を全く書いてないので,
たまーには,書いてみる.たいした内容じゃないけど.
知っとくとちょっと便利な.OpenGL基本合成設定.
//アルファ合成 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //加算合成 glBlendFunc(GL_SRC_ALPHA, GL_ONE); //乗算合成 glBlendFunc(GL_ZERO, GL_SRC_COLOR); //反転合成 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); 【追追記】 //スクリーン合成 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); //排他的論理和合成 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
二度書き,三度書きとかがOKなら,
スクリーン合成とか,減算合成とか,ハードライトとか,オーバーレイも
多分可能なんだけど(やったことは無い),一度書き限定だとこんなもんかなぁ.
【追記】
ちょっとまじめに考えてみたら,
ハードライトとオーバーレイは単なる合成だけじゃ無理な感じ.
ステンシルか何かで場合分けしないと出来ない気がする.
【追追記】
時間かけてちゃんと考えてみたら,
スクリーン合成って一度書きで出来る(↑に追加).
減算は三度書きで一応できるっぽいけど,うーん.
// 反転して glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); glColor3f(1,1,1); glRectf(〜); // 加算描画して glBlendFunc(GL_SRC_ALPHA, GL_ONE); Draw(); // 反転 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); glColor3f(1,1,1); glRectf(〜);
ハードライトとオーバーレイはかなり厳しいっぽいなぁ.
条件分岐用マスク生成とか,コストが高すぎ.
あ,ちなみに「つ[ピクセルシェーダー]」って突っ込みは禁止.