#contents

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

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

*各レイヤーの計算方法 [#d23815ac]

**通常 [#x715c08d]

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

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

具体例(画面:128, 描画する色:200):
 200 * 0.4 + 128 * 0.6

***OpenGLでは [#cc1a23b7]
アルファを考慮できます。
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

**加算(覆い焼き(リニア)) [#ve64ab46]

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

 src * alpha + dest

***OpenGLでは [#g91dfc3d]

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

 src * alpha + dest * 1
 src * GL_SRC_ALPHA + dest * GL_ONE
よって、
 glBlendFunc(GL_SRC_ALPHA, GL_ONE);

**乗算 [#vd64439b]

基本的に暗くなる。

 dest * src

***OpenGLでは [#lf280b4d]

 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とかに)。
**スクリーン [#i99cdb6d]
そのまま加算じゃないよ合成。

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

具体例(画面:128, 描画する色:161):
 208 = (161 + 128) - 255 * (161.0 / 255 * 128.0 / 255)

***OpenGLでは [#tc1810cc]
 src + dest - src * dest
 src * (1 - dest) + dest
 SRC * GL_ONE_MINUS_DST_COLOR + DEST
となり、
 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
で、できるハズ?

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

*参考リンク [#ya7a0f4a]
-がくのほめぱげ - 色の結合演算について(その1)
http://www.bea.hi-ho.ne.jp/gaku-iwa/color/conjn.html
-グラフィックシステム
http://devdoc.kikyou.info/tvp/docs/kr2doc/contents/GraphicSystem.html
-Ko-Taのバ・ー・ル!!のようなもの - スクリーンと加算の考察
http://d.hatena.ne.jp/Ko-Ta/20060825/p1
-Simple Inspiration - ■[OpenGL][フリーゲーム作製] 斑鳩のボス警告のアレ
http://d.hatena.ne.jp/keim_at_Si/20060210
-ボロリン | 3DCGプログラミングをしよう ch.4 αブレンドと深度バッファについて
http://blog.jyoken.net/?eid=553888
-Simple Filter - Blending Modes http://www.simpelfilter.de/en/grundlagen/mixmods.html

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

#comment

TIME:"2007-08-30 (木) 04:12:46" REFERER:"http://tobysoft.net/wiki/index.php?PhotoShop%2F%A5%EC%A5%A4%A5%E4%A1%BC%A4%CE%B7%D7%BB%BB%CA%FD%CB%A1%A4%CB%A4%C4%A4%A4%A4%C6" USER_AGENT:"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2) Sleipnir/2.5.15"
Front page   Edit Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes