Document

A-
Apendix
混合処理&Fog
混合処理:物体と背景色あるいは重なり合った物体同士の色を混合して
表示する手法について説明する.
A.1. アルファブレンディング
A.1.1. アルファブレンディングの仕組み
source
透明な物体を通して背後の物体を見た場合
には,背後の物体色に透明な物体の色が
混合されて見える.アルファブレンディング
では,光の透過による屈折を考慮せず重な
り合った部分の色を混合することのみによ
り透明感を表現する.
背景すなわち先にフレームバッファに入って
いるRGBA値をデスティネーション
(destination),描画する物体のRGBA値を
ソース(source)と呼び,両者のRGB値にそ
れぞれのA値から算出される混合係数を掛
けて重畳する.
destination
1
A-
A.1.2. アルファブレンディングの仕組み
以下の(1)~(3)をプログラムに付加する.
(1) ソースとデスティネーションの混合係数の指定(myInit関数などで)
glBlendFunc( ソースの混合係数, デスティネーションの混合係数);
よく利用される引数の設定を以下に示す.
① glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
② glBlendFunc( GL_SRC_ALPHA, GL_ONE );
③ glBlendFunc( GL_ONE, GL_ZERO );
この他,引数にGL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA,
GL_SRC_COLOR, GL_DST_COLORなどの指定が可能.
2
A-
3
① glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
ソースの色にソースのアルファ値を掛ける
デスティネーションの色に(1-ソースのアルファ値)を掛ける
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
α
1-α
A-
② glBlendFunc( GL_SRC_ALPHA, GL_ONE );
ソースの色にソースのアルファ値を掛ける
デスティネーションの色をそのまま用いる(1を掛ける)
GL_SRC_ALPHA, GL_ONE
α
1
4
A-
③ glBlendFunc( GL_ONE, GL_ZERO ); ・・・ ブレンド無し
ソースの色をそのまま用いる
デスティネーションの色を反映させない(0を掛ける)
GL_ONE, GL_ZERO
1 0
5
A-
(2) アルファブレンディング有効範囲の指定(display関数で)
glEnable(GL_BLEND);
・・・・
この間の物体色が混合される
glDisable(GL_BLEND);
(3) 色の指定(描画オブジェクトに設定)
①シェーディング無しの場合
glColor4f( R,G,B,A);
もしくは,
float color[ ] = {R,G,B,A};
・・・・
glColor4fv( color );
②シェーディング有りの場合
float color[ ] = {R,G,B,A};
・・・・
glMaterialfv( ,,color );
物体同士の重なり部分が不自然な場合には隠面処理を無効にしてみる
6
A-
実行!
a1-1.cをコピーして実行する.設定を変えて試し
てみる.
7
A-
A.1.3. 後ろ向きポリゴンの切り取り(Culling)
球や立方体のようなポリゴンで囲まれる基本立体にアルファブレン
ディングを施すと,ソースが表面,デスティネーションが裏面ポリゴン
になるために物体の表示が不自然になる場合がある.それを回避す
る方法のひとつとして,裏面をむけたポリゴンを削除するように設定す
ることが出来る.
以下の(1)~(3)の設定を行う
(1)削除する面の指定(myInit等の中でglCullFace )
(2)カリング処理の範囲の指定
(3)ポリゴンの表面の定義(必要な場合のみ)
8
A-
(1)削除する面の指定
glCullFace(削除する面の指定);
引数(削除する面の指定)は次の中から選択する
GL_FRONT, 表面を向けたポリゴンの削除
GL_BACK,
裏面を向けたポリゴンの削除
GL_FRONT_AND_BACK 全ポリゴンの削除
(2)カリング処理の範囲の指定
glEnable(GL_CULL_FACE);
・・・・・・
この間でカリング処理が行われる
glDisable(GL_CULL_FACE);
(3)ポリゴンの表面の定義(必要な場合のみ)
glFrontFace(表面の定義);
引数(表面の定義)の指定は次の通り
GL_CCW・・・ポリゴン頂点の左回りを正の方向とする(デフォルト)
GL_CW ・・・ポリゴン頂点の右回りを正の方向とする
9
A- 10
実行!
a1-2.cをコピーして実行する.
A- 11
練習問題a-1:
1)プログラムa1-2.cにおいてカリングを無効にした場合の描画を確認せよ.
a1-2-nocull.c
2)プログラムa1-1.cにおいて矢印キーの操作によりアルファ値が増減するように
設定せよ.また,F1キーを押す度に混合の方法が変わるように設定せよ.
解答例pa1-1.c
A- 12
A.2 アンチエイリアシング
アンチエイリアシングとは,点や線分あるいはポリゴンのエッジ部の境界画素
に中間色を設定することによりジャギーを除く処理.
OpenGLでは,システムが境界と判断した画素にソースとデスティネーション
の色が混合されて設定される.ハードウェアの性能が低い場合には,表示が
極端に遅くなるので多用しないこと.
A.2.1. 設定方法
(1)混合方法の設定・・・初期設定
(2)処理対象の基本図形と範囲を指定する・・・display関数
(3)混合処理の範囲指定・・・display関数
A- 13
エリアシング(画像のギザギザ)を見えにくくする処理
通常の線分発生法
アンチエリアシング
やや薄い色にす
ることで滑らかさ
を出す
A- 14
(1)混合方法の設定・・・初期設定
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor( 0.0, 0.0, 0.0, 0.0);
背景と混合する場合には,背景のアルファ値をゼロにする.
(2)処理対象の基本図形と範囲を指定する・・・display関数
glEnable(処理対象の基本図形);
・・・・・
glDisable(処理対象の基本図形);
処理対象の基本図形は次のように図形毎に指定する.
glEnable( GL_POINT_SMOOTH )・・・点
GL_LINE_SMOOTH ・・・線
GL_POLYGON_SMOOTH・・・ポリゴンのエッジ
物体が重なる場合には,zバッファを併用する
(3)混合処理の範囲指定・・・display関数 glClearColor( 0.0, 0.0, 0.0, 0.0);
glEnable(GL_BLEND);
背景と混合する場合には,背景の
・・・・
アルファ値をゼロにする.
glDisable(GL_BLEND);
A- 15
実行!
a2-1.cをコピーして実行する.
A- 16
追加.
glHint() 関数を使って,クオリティを選択することができる
void glHint(GLenum target , GLenum mode);
例:
glHint(GL_LINE_SMOOTH_HINT , GL_FASTEST);
定数
意味
GL_FASTEST
最も効率的なオプション
GL_NICEST
最も正確で,最高品質のオプション
GL_DONT_CARE
オプションを選択しない
練習問題a-2:
1)a2-1.cにポリゴンを追加して,F1キーを押すとアンチエイリアシングが施され
るようにせよ.
解答例pa2-1.c
A- 17
A.3 フォグ
視点からの距離,すなわちz値に比例して背景色を物体色に混合するこ
とにより奥行き感を表す.背景を白にするとあたかも霧の中の風景のよ
うな印象の画像を生成することが出来る.
A.3.1. 設定方法
(1)フォグの有効化
glEnable(GL_FOG);
(2)フォグの関数の設定
glFogi(GL_FOG_MODE,GL_LINEAR);
第1パラメータ GL_FOG_MODE
第2パラメータ GL_LINEAR, GL_EXP, GL_EXP2
GL_LINEARを設定した場合,フォグの開始点と終了点を設定できる.
(end  z )
glFogf(GL_FOG_START, 0.0);
f 
(end  start)
glFogf(GL_FOG_END,10.0);
また,GL_EXP, GL_EXP2を設定した場合,フォグの濃度を指定できる.
glFogf(GL_FOG_DENSITY, 3.0);
(density・ z )
f e
(density・ z )2
f e
A- 18
(3)フォグの色の設定
glFloat fogc[]={0.6f,0.6f,0.5f,1.0f};
glFogfv(GL_FOG_COLOR,fogc);
(4)フォグのヒントの設定
glHint(GL_FOG_HINT,GL_DONT_CARE);
第1パラメータ GL_FOG_HINT
第2パラメータ
GL_DONT_CARE:好きなようにせよ
GL_FASTTEST:最も速い方法を使用せよ
GL_NICEST:正確な方法を使用せよ
A- 19
実行!
fog.cをコピーして実行する.