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
© Copyright 2025 ExpyDoc