GLBLENDFUNC

Section: Misc. Reference Manual Pages (3G)
索引 xjman
 

名前

glBlendFunc ピクセルの計算方法を指定する

 

書式

void glBlendFunc( GLenum sfactor,

                    GLenum dfactor )

delim $$  

引き数

sfactor
赤、青、緑、アルファ値の入力ブレンド係数の 計算方法を指定する。 指定できる値は次の通りである: GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA_SATURATE。 初期値は GL_ONE である。

これに加えて、GL_ARB_imaging 機能拡張に対応している 場合には次の定数も指定できる: GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA

dfactor
赤、青、緑、アルファ値の出力ブレンド係数の計算方法を 指定する。 8 個のシンボル定数を指定できる: GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA。 初期値は GL_ZERO である。

これに加えて、GL_ARB_imaging 機能拡張に対応している 場合には次の定数も指定できる: GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA

 

説明

RGBA モードでは、ピクセルを描画する際に 外部にある(入力)RGBA 値と既にフレームバッファ内にある RGBA 値(出力値)を混ぜる機能を利用できる。 ブレンド機能は初期状態では無効である。 ブレンド機能の有効/無効の切り替えを行うには、 glEnable または glDisable に引き数 GL_BLEND を与えて実行すること。 glBlendFunc は、ブレンド機能が有効な場合のブレンド機能の 動作を定義する。 sfactor は、入力色要素のスケーリングに使う方法を 9 種類の中から 指定する。 sfactor は、出力色要素のスケーリングに使う方法を 8 種類の中から 指定する。 使用できる 11 の方法を次の表で説明する。 それぞれの方法は 4 つのスケーリング係数を定義し、 順に赤、緑、青、アルファ値に対応する。 表およびその後に示す式においては、入力色要素と出力色要素は $(R sub s , G sub s , B sub s , A sub s )$ および $(R sub d , G sub d , B sub d , A sub d )$ で示される。 glBlendColor によって指定される色は $(R sub c , G sub c , B sub c , A sub c )$ で示される。 これらは 0 から $(k sub R , k sub G , k sub B , k sub A )$ の間の整数値を取るものとされる。ここで
$k sub c ~=~ 2 sup m sub c - 1$
であり、 $(m sub R , m sub G , m sub B , m sub A )$ は赤、緑、青、アルファ値のビットプレーンの数である。 入力スケール要素と出力スケール要素は $(s sub R , s sub G , s sub B , s sub A )$ および $(d sub R , d sub G , d sub B , d sub A )$ で示される。 表においてスケーリング係数は $(f sub R , f sub G , f sub B , f sub A )$ で示され、入力スケーリング係数と出力スケーリング定数を 表す。 全てのスケーリング係数は [0, 1] の範囲を取る。

Parameter$(f sub R , ~~ f sub G , ~~ f sub B , ~~ f sub A )$

GL_ZERO$(0, ~0, ~0, ~0 )$
GL_ONE$(1, ~1, ~1, ~1 )$
GL_SRC_COLOR$(R sub s / k sub R , ~G sub s / k sub G , ~B sub s / k sub B , ~A sub s / k sub A )$
GL_ONE_MINUS_SRC_COLOR$(1, ~1, ~1, ~1 ) ~-~ (R sub s / k sub R , ~G sub s / k sub G , ~B sub s / k sub B , ~A sub s / k sub A )$
GL_DST_COLOR$(R sub d / k sub R , ~G sub d / k sub G , ~B sub d / k sub B , ~A sub d / k sub A )$
GL_ONE_MINUS_DST_COLOR$(1, ~1, ~1, ~1 ) ~-~ (R sub d / k sub R , ~G sub d / k sub G , ~B sub d / k sub B , ~A sub d / k sub A )$
GL_SRC_ALPHA$(A sub s / k sub A , ~A sub s / k sub A , ~A sub s / k sub A , ~A sub s / k sub A )$
GL_ONE_MINUS_SRC_ALPHA$(1, ~1, ~1, ~1 ) ~-~ (A sub s / k sub A , ~A sub s / k sub A , ~A sub s / k sub A , ~A sub s / k sub A )$
GL_DST_ALPHA$(A sub d / k sub A , ~A sub d / k sub A , ~A sub d / k sub A , ~A sub d / k sub A )$
GL_ONE_MINUS_DST_ALPHA$(1, ~1, ~1, ~1 ) ~-~ (A sub d / k sub A , ~A sub d / k sub A , ~A sub d / k sub A , ~A sub d / k sub A )$
GL_SRC_ALPHA_SATURATE$(i, ~i, ~i, ~1 )$
GL_CONSTANT_COLOR$(R sub c, G sub c, B sub c, A sub c)$
GL_ONE_MINUS_CONSTANT_COLOR$(1, ~1, ~1, ~1 ) ~-~ (R sub c, G sub c, B sub c, A sub c)$
GL_CONSTANT_ALPHA$(A sub c, A sub c, A sub c, A sub c)$
GL_ONE_MINUS_CONSTANT_ALPHA$(1, ~1, ~1, ~1 ) ~-~ (A sub c, A sub c, A sub c, A sub c)$

表においては

$i ~=~ min (A sub s , ~k sub A ~-~ A sub d ) ~/~ k sub A$
である。 RGBA モードでの描画において、あるピクセルの RGBA ブレンド値を決める際 にはシステムは次の式を用いる:
$R sub d ~=~ mark min ( k sub R, ~R sub s~s sub R~+~R sub d~d sub R )$ $G sub d ~=~ lineup min ( k sub G, ~G sub s~s sub G~+~G sub d~d sub G )$ $B sub d ~=~ lineup min ( k sub B, ~B sub s~s sub B~+~B sub d~d sub B )$ $A sub d ~=~ lineup min ( k sub A, ~A sub s~s sub A~+~A sub d~d sub A )$
上記の式は見かけは厳密であるが、ブレンド式は正確には指定されてない。 なぜなら、ブレンド処理は整数(厳密でない)の色値を扱うからである。 しかし、1 であるはずのブレンド係数を他の値に掛けても値を変えないし、 ブレンド係数が 0 を他の値に掛けると 0 になることが保証される。 例えば、sfactorGL_SRC_ALPHA であり、 dfactorGL_ONE_MINUS_SRC_ALPHA であり、 $A sub s$ が $k sub A$ に等しいとき、上記の式は次のような 簡単な形になる:
$R sub d ~=~ mark R sub s$ $G sub d ~=~ lineup G sub s$ $B sub d ~=~ lineup B sub s$ $A sub d ~=~ lineup A sub s$
 

使用例

透過効果は、遠くから近くの順序でソートしたプリミティブに 対してブレンド関数 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) を使うことで非常にうまく実装できる。 この際の透過に関する計算では、フレームバッファ内に アルファビットプレーンが存在する必要はない。 ブレンド関数 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) は、任意の順序で並んでいる点や線をアンチエイリアシング処理 してレンダリングする際にも便利である。 ポリゴンのアインチエイリアシング処理は、 近くから遠くの順でソートしたポリゴンに対してブレンド関数 (GL_SRC_ALPHA_SATURATE, GL_ONE) を使うことで最適化される。 (ポリゴンのアンチエイリアシング処理については、 glEnable, glDisable のページの GL_POLYGON_SMOOTH 引き数に関する説明を参照すること。) 出力先のアルファビットプレーン(このブレンド関数が正しく動作するために は存在しなければならない)は、加算処理されたカバレージを格納する。  

注意

入力されるアルファ値(入力アルファ値)は正確に言えば物質の不透明度と考え られる。 この値は範囲 1.0 ($K sub A$) から 0.0 (0) を取る。 前者の値は完全に不透明であり、後者は完全に透明である。 複数のカラーバッファで描画が有効になっている場合、GL は有効に なっている各バッファに対して別々にブレンド処理を実行する。 出力色としては、それぞれのバッファの内容が使われる。 (glDrawBuffer を参照すること。) ブレンド処理は RGBA レンダリングにしか影響を与えない。 色インデックスレンダリングでは無視される。 GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA を使えるのは、利用している実装が GL_ARB_imaging に対応 している場合だけである。  

エラー

sfactor または dfactor に不正な値が指定されると GL_INVALID_ENUM が生成される。 glBegin とその対になる glEnd の間で glBlendFunc が実行されると GL_INVALID_OPERATION が生成される。  

関連する取得値

引き数 GL_BLEND_SRC を指定した glGet
引き数 GL_BLEND_DST を指定した glGet
引き数 GL_BLEND を指定した glIsEnabled
 

関連項目

glAlphaFunc(3G), glBlendColor(3G), glBlendEquation(3G), glClear(3G), glDrawBuffer(3G), glEnable(3G), glLogicOp(3G), glStencilFunc(3G)


 

Index

名前
書式
引き数
説明
使用例
注意
エラー
関連する取得値
関連項目

jman



Time: 07:01:04 GMT, January 12, 2009