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 以降のカードが標準で載ってる前提で考えていいのかなぁ……。