- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

はじめに Edit

レイヤーの計算方法についての考察。
プログラムの話になるので、ここで書くべきではないかも。
ゲームプログラムとかで使うのを想定してます。

OpenGLでのブレンド方法については、
OpenGL/glBlendFuncについてを参照

各レイヤーの計算方法 Edit

通常 Edit

そのままコピーする通常の合成。

dest = src * Alpha - dest * (1 - Alpha)

具体例(画面:128, 描画する色:200):

200 * 0.4 + 128 * 0.6

OpenGLでは Edit

アルファを考慮できます。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

加算(覆い焼き(リニア)) Edit

基本的に明るくなる、そのまま足す加算合成。
PhotoShopだと、覆い焼き(リニア)です。ver 7.0から搭載。
明るくなりすぎて、すぐにサチュレーション(飽和)する

src * alpha + dest

OpenGLでは Edit

アルファを考慮できます。

src * alpha + dest * 1
src * GL_SRC_ALPHA + dest * GL_ONE

よって、

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

乗算 Edit

基本的に暗くなる。

dest * src

OpenGLでは Edit

src * 0 + dest * src * color

より、

glBlendFunc(GL_ZERO, GL_SRC_COLOR);

です。
この場合、glColorを使うと真っ黒になってしまうので注意です。

glColorを使いたい場合は、こちら。
ただし、反転した画像を用意する必要があります。

src * 0 + dest * (1 - src * color)
glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);

となるはずです。

シェーダーなしでは、アルファは考慮できません。
薄くしたい場合は、後者の方法(GL_ONE_MINUS_SRC_COLOR)で、
glColorで、RGB全要素を0に近づければ、薄くなります(0.5とかに)。

スクリーン Edit

そのまま加算じゃないよ合成。

dest = (src + dest) - (src * dest)

具体例(画面:128, 描画する色:161):

208 = (161 + 128) - 255 * (161.0 / 255 * 128.0 / 255)

OpenGLでは Edit

src + dest - src * dest
src * (1 - dest) + dest
SRC * GL_ONE_MINUS_DST_COLOR + DEST

となり、

glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);

で、できるハズ?

アルファの考慮はできない模様です。

参考リンク Edit


  • PhotoShopのクリップボード上のデータを調べてたらこんなところに来てしまいました。Alpha考慮はPixelShader使うかなさそうっすよ。 -- Ko-Ta? 2007-05-11 (金) 06:01:06
  • スクリーンのことっすよね。やはし、Shaderしかないのかなあ。 -- 2007-05-11 (金) 18:16:16
  • TextureのAlphaはTextureStageでなんとか白・黒・灰色Textureとのブレンドを用いることで、反映できました。
    OpenGLでもいけるんじゃないかと思います。
    http://d.hatena.ne.jp/Ko-Ta/20070618/p1 -- Ko-Ta? 2007-06-20 (水) 10:58:01
  • glColor をうまく使えば、α を考慮して転送できそうな予感です。
    http://d.hatena.ne.jp/melt_slinc/20070824 -- melt? 2007-08-25 (土) 13:42:47
  • すみません、超勘違い君でした……。 -- melt? 2007-08-25 (土) 14:47:37
  • うは!できたらよかったですね。おしかったです( ´∀`) -- TOBY 2007-08-30 (木) 04:12:46


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2007-08-30 Thu 04:12:46 JST (3674d)