Document

6-
6.
1
シェーディング
シェーディング(shading,濃淡づけ)とは物体形状・表面性状や照明などから
各点の明るさや色を求める方法.
光源の角度や物体面の角度,視点の角度によって(物理的性質に基づいて)
物体面の明るさが変わることに基づく.
「陰」(Shade)=光のあたり方によっ
て暗くなった物体部分
「影」(Shadow,silhouette)=物体に
よって遮られ光が届かない場所
6-
6.1.1. シェーディングの原理
反射成分の種類は三種類あり,それぞれごとの成分が視点に到達する強度
を足し合わせて物体の一点の輝度を求める
N
反射光
入射光
α
R
γ
光源
反射光
入射光
α
L
α
V
拡散反射
diffuse
鏡面反射
specular
環境光反射
ambient
光源
2
6-
拡散反射成分(Diffuse)
・全ての方向に一様に散乱される.視点の方向に依存しない.
・物体の持つ色を反映する.面の傾きの差異により生成される濃淡の違
いが陰影として知覚される.
鏡面反射成分(Specular)
・入射光が特定方向に強く反射され,ハイライトと呼ばれる輝点が
生じる.
・鏡面反射方向は面の法線方向に対して,入射光と対称となる角度
付近.従って,ハイライト強度は視点位置により異なる.
環境光反射成分(Ambient)
・空気による散乱光や他の物体からの反射光.
・環境光を考慮しないと宇宙空間のような,「くっきり」した不自然な
絵になる.
3
6-
6.1.2. シェーディング計算の設定方法
1)光源を有効にする(初期設定)
glEnable(GL_LIGHT0);
8つまで使えるLight種類選択の指定
2)ポリゴンの頂点に法線ベクトルを設定
(頂点の向きによって反射方向が変わることに注意)
glNormal3f(x,y,z);
glVertex3f()の前に記述する.
x,y,zは法線ベクトルの成分なので,原点から(x,y,z)までのベク
トルの長さが1でないといけない.
3)シェーディング処理を行なう範囲を指定
glEnable(GL_LIGHTING);
...
glDisable(GL_LIGHTING);
4
6-
6.1.3. シェーディングの例
実行!
c6-1.cをコピーして実行する.
実行!
c6-2.cをコピーして実行する(頂点ごとに法線方
向を設定.
5
6-
練習問題6-1:
1)プログラムc6-2.cにおいて法線ベクトルのデータを変更してシェーディング
の結果を確認せよ.
次のいずれかの方法で単位ベクトルとなるように規格化すること.
方法1:
ベクトル m =(p,q,r)に対し,
ベクトルの長さ l = √ p2 + q2 + r2
単位ベクトル n = (p/l, q/l,r/l)
方法2:
法線ベクトルを規格化する範囲を以下で囲む(glNormal3f()の前後におく).
glEnable(GL_NORMALIZE);
glDisable(GL_NORMALIZE);
変更例p6-1
6
6-
6.2. 表面属性の設定
6.2.1. 設定方法
物体表面の持つ光の反射属性を表面属性(Surface Attribute)と呼ぶ.
glMaterial*(材料が設定される面,材質特性,設定値/データ配列);
GL_FRONT
GL_BACK
面:
GL_FRONT_AND_BACK
材質
特性
GL_DIFFUSE:拡散反射成分
GL_SPECULAR:鏡面反射成分
GL_AMBIENT:環境光反射成分
GL_EMISSION:発光物体の設定(0.0~1.0)
GL_SHININESS:鏡面反射の鋭さ(0.0~128.0)
*=f,i,fv,iv:データの形式
7
6-
glMaterial*(材料が設定される面,材質特性,設定値);
設定例1:
float diffuse[] = {1.0,1.0,1.0,1.0};
float specular[] = {1.0,1.0,1.0,1.0};
float ambient[] = {0.1,0.1,0.1,0.1};
glMaterialfv(GL_FLONT,GL_DIFFUSE,diffuse);
glMaterialfv(GL_FLONT,GL_SPECULAR,specular);
glMaterialfv(GL_FLONT,GL_AMBIENT,ambient);
設定例2:
glMaterialf(GL_FLONT,GL_SHININESS,128.0);
8
6-
6.2.2 表面属性を設定した球の描画
実行!
c6-3.cをコピーして実行する.
Shininess=32
Shininess=128
9
6- 10
練習問題6-2:
1)p90の練習問題,(1),(2)
6- 11
・ゴールド
float diffuse[] = {0.7,0.6,0.2,1.0};
float specular[] = {0.6,0.5,0.4,1.0};
float ambient[] = {0.3,0.2,0.1,1.0};
float shininess[] = 50.0;
・シルバー
float diffuse[] = {0.6,0.6,0.6,1.0};
float specular[] = {0.5,0.5,0.5,1.0};
float ambient[] = {0.2,0.2,0.2,1.0};
float shininess[] = 60.0;
・プラスティック
float diffuse[] = {0.1,0.4,0.1,1.0};
float specular[] = {0.5,0.6,0.5,1.0};
float ambient[] = {0.0,0.0,0.0,1.0};
float shininess[] = 128.0;
6- 12
6.3. スムーズシェーディング
1)フラットシェーディング:ポリゴン内を1つのデータで表わす
2)スムーズシェーディング:頂点データを距離比により混合して
表わす.
混合の仕方により,グーローシェーディング,フォンシェーディング
があるが,OpenGLではグーローシェーディングが用いられる
glShadeMode(GL_FLAT);
glShadeMode(GL_SMOOTH);
6- 13
6.3.2 表面属性を設定した球の描画
実行!
FLAT
c6-4.cをコピーして実行する.
FLAT
(normalvectorの
設定が違う)
SMOOTH