melpon日記 - HaskellもC++もまともに扱えないへたれのページ

2007-08-24

[][]OpenGL、glBlendFunc メモ OpenGL、glBlendFunc メモを含むブックマーク

// 通常転送(αなし)
glBlendFunc(GL_SRC_ONE, GL_ZERO);

// 通常転送(αあり)
// つまりαブレンドのこと
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// dst 反転
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // src = 1 固定
// 加算(αなし)
glBlendFunc(GL_ONE, GL_ONE);

// 加算(αあり)
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
// 減算(αなし)
dst = dst - src
    = dst - src + 1 - 1
    = 1 - (src + 1 - dst)
    = 1 - (src + (1 - dst))
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // src = 1 固定
glBlendFunc(GL_ONE, GL_ONE);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // src = 1 固定

// 減算(αあり)
dst = dst - src * alpha
    = dst - src * alpha + 1 - 1
    = 1 - (src * alpha + 1 - dst)
    = 1 - (src * alpha + (1 - dst))
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // src = 1 固定
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // src = 1 固定
// 乗算(αなし)
// αをかけたい部分を白くしていけばαありに見えるようになる。
glBlendFunc(GL_ZERO, GL_SRC_COLOR);

// 乗算(αあり)
// α値が小さくなればなるほど真っ黒になるので、
// むしろαなしと言えるのかもしれない
dst = dst * src * alpha
    = (dst * src) * alpha
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
// スクリーン(αなし)
dst = 1 - (1 - dst) * (1 - src)
    = 1 - (1 - dst - src + dst * src)
    = 1 - 1 + dst + src - dst * src
    = dst + src - dst * src
    = src + dst * (1 - src)
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);

// スクリーン(αあり)
無理ぽ
// 除外(αなし)
dst = src * (1 - dst) + dst * (1 - src)
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);

// 除外(αあり)
無理ぽ

スクリーン(αあり)を作りたかったんだけど、これはピクセルシェーダを勉強するべきか……。


って OpenGLピクセルシェーダ言語である GLSL って 2.0 以降しか対応してないのね……。

今って OpenGL 2.0 以降のカードが標準で載ってる前提で考えていいのかなぁ……。

トラックバック - http://d.hatena.ne.jp/melpon/20070824/p1