読者です 読者をやめる 読者になる 読者になる

斑鳩のボス警告のアレ

OpenGL フリーゲーム作製



原理的にどうやればいいか,頭の中にはあったんですが,
実際にやった事は無かった(というより使う機会が無かった)反転合成.


実際にやってみると,かなりカッコエェ...


わー,何かいろんなところで使いたくなってきた.


ところで,最近,プログラムっぽい話を全く書いてないので,
たまーには,書いてみる.たいした内容じゃないけど.
知っとくとちょっと便利な.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(〜);

ハードライトとオーバーレイはかなり厳しいっぽいなぁ.
条件分岐用マスク生成とか,コストが高すぎ.
あ,ちなみに「つ[ピクセルシェーダー]」って突っ込みは禁止.