情報工学
2023年度後期 第6回 [11月29日]
静岡大学
工学研究科機械工学専攻
ロボット・計測情報講座
創造科学技術大学院
情報科学専攻三浦 憲二郎情報工学CGパート試験•日時 １２月６日（水） 午前１０：２０～１１：５０•場所 工学部1号館３２号室

講義アウトライン [11月29日]•ビジュアル情報処理•2 モデリング•2.3 曲線・曲面•OpenGL•色の取り扱い•シェーディング
•照明モデルと照光処理

拡散光
鏡面光
環境光

ビジュアル情報処理•2-3 曲線・曲面•2-3-1 曲線の表現形式

ビジュアル情報処理•2-3-1 [2] パラメトリック表現

ビジュアル情報処理•2-3-2 2次曲線

ビジュアル情報処理•2-3-3 パラメトリック曲線 ベジエ曲線

ビジュアル情報処理•2-3-3 パラメトリック曲線 ベジエ曲線

ビジュアル情報処理•2-3-4 パラメトリック曲面 ベジエ曲面

OpenGL:色の取り扱い
1. RGBAモード
R, G, B, A ごとに値を指定
glutInitDisplayMode(GLUT_RGB);
2. カラーインデックスモード
各色に対応するインデックスナンバーを指定
glutInitDisplayMode(GLUT_INDEX);RGBAモード
void

glColor3{b s i f d ub us ui}(TYPE r, TYPE g, TYPE b)
void

glColor4{b s i f d ub us ui}(TYPE r, TYPE g, TYPE b,TYPE a)b: byte, s: short, i: integer, f: float, d: double

ub: unsigned byte, us: unsigned short, ui: unsigned int
0<= float, double value <= 1

a: アルファ値

色の「混合処理」, 「変調処理」

シェーディング
1. フラットシェーディング
立体の面や線を単一の色で描画する方法
2. スムースシェーディング
複数の色を補間して描画する方法
void glShadeModel(GLenum mode)
mode: GL_FLAT, GL_SMOOTH

照明
1. 環境光 (ambient light)
何度となく反射を繰り返し, 方向を特定できない光
2. 拡散光 (diffuse light)
すべての方向に均一に散乱する光
3. 鏡面光 (specular light)
照明に対して特定の方向に強く反射する光

環境光
1. 環境光 (ambient light)
何度となく反射を繰り返し, 方向を特定できない光拡散光
2. 拡散光 (diffuse light)
すべての方向に均一に散乱する光

鏡面光
3. 鏡面光 (specular light)
照明に対して特定の方向に強く反射する光

照明の数と属性
GL_LIGHT0, GL_LIGHT1, … , GL_LIGHT7
少なくとも 8 個の照明が使える.
void

glLight{if}[v](GLenum light, GLenum pname,TYPE param)例
GLfloat color[] = {1.0f,0.0f,0.0f,1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, color);

glLight*()の引数 pname
パラメータ名
GL_DIFFUSE

初期値(1.0,1.0,1.0,1.0)

GL_SPECULAR (1.0,1.0,1.0,1.0)
GL_AMBIENT(0.0,0.0,0.0,1.0)

GL_POSITION (0.0,0.0,1.0,0.0)

意味
拡散光のRGBA値
鏡面光のRGBA値
環境光のRGBA値
照明の位置(x,y,z,w)

注意： 照明の位置の w 座標値が 0 の場合は無限遠
したがって, 平行光線

0 でない場合は点光源

照光処理の有効化
有効化
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);/* glColor*()による色の指定は無効 */無効化
glDisable(GL_LIGHTING);/* glColor*()による色の指定が有効 */光の減衰
平行光線の光は距離による輝度の減衰はない.
点光源の場合, 距離 d によって輝度が減衰する.

1
減衰係数 =k c + kl d + k q d 2
kc:GL_CONSTANT_ATTENUATION
kl:GL_LINEAR_ATTENUATION

kq:GL_QUADRATIC_ATTENUATION

材質の色
照明の 拡散光, 鏡面光, 環境光 に対する材質の特性＋
放射光
void

glMaterial{if}[v](GLenum face, GLenum pname,TYPE param)例
GLfloat color[] = {1.0f,0.0f,0.0f,1.0f};

glMaterialfv(GL_FRONT, GL_DIFFUSE, color);

glMaterial*()の引数 pname
パラメータ名
GL_DIFFUSE

初期値(0.8,0.8,0.8,1.0)

GL_SPECULAR (0.0,0.0,0.0,1.0)
GL_AMBIENT意味
拡散光のRGBA値
鏡面光のRGBA値(0.2,0.2,0.2,1.0)

環境光のRGBA値

GL_EMISSION (0.0,0.0,0.0,1.0)

放射光のRGBA値

GL_SHININESS 0.0

0.0 <= GL_SHININESS <= 128.0

鏡面の指数

面の法線ベクトルの指定
void

glNormal3{bsidf}(TYPE nx, TYPE ny,TYPE nz)

b, s, i の場合は, 各値の範囲を[-1.0,1.0]に縮小ベクトル版 glNormal3{bsidf}v()も存在する.

頂点カラーの計算
頂点カラー = その頂点での材質からの放射 ＋その頂点での材質の環境特性で測られる
グローバル環境光 ＋
適切に減衰した, すべての光源からの環境, 拡散, 鏡面光照光計算を実行した後, カラー値は[0,1]の範囲にクランプ(RGBAモード)

材質放射
頂点カラー = その頂点での材質からの放射 ＋その頂点での材質の環境特性で測られる
グローバル環境光 ＋
適切に減衰した, すべての光源からの環境, 拡散, 鏡面光パラメータ GL_EMISSION に割り当てられたRGB値
glMaterialfv(GL_EMISSION, color);グローバル環境光
頂点カラー = その頂点での材質からの放射 ＋その頂点での材質の環境特性で測られる
グローバル環境光 ＋
適切に減衰した, すべての光源からの環境, 拡散, 鏡面光グローバルな環境光 と
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, color0);
材質の環境特性 の積
glMaterialfv(GL_AMBIENT, color1);
RGB値, 別々に計算

光源からの影響
頂点カラー = その頂点での材質からの放射 ＋その頂点での材質の環境特性で測られる
グローバル環境光 ＋
適切に減衰した, すべての光源からの環境, 拡散, 鏡面光

光源からの影響 = 減衰係数 * スポットライト効果 *(環境光の項 + 拡散光の項 + 鏡面光の項)

環境, 拡散, 鏡面光の項：
照明の各成分 と 材質の各成分 の 積

rotCube.cのinitLights()
voidinitLights(void){
GLfloat light0_diffuse[] = {0.9, 0.9, 0.9, 1.0}; /* 拡散成分 */GLfloat light1_diffuse[] = {0.5, 0.5, 0.5, 1.0}; /* 拡散成分 */GLfloat light_specular[] = {0.3, 0.3, 0.3, 1.0}; /* 鏡面成分 */GLfloat lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0}; /* 周囲光 */glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );glLightfv ( GL_LIGHT0, GL_DIFFUSE, light0_diffuse );//glLightfv ( GL_LIGHT1, GL_SPECULAR, light_specular );glLightfv ( GL_LIGHT1, GL_DIFFUSE, light1_diffuse );glLightfv ( GL_LIGHT1, GL_SPECULAR, light_specular );glLightfv ( GL_LIGHT2, GL_DIFFUSE, light1_diffuse );glLightfv ( GL_LIGHT2, GL_SPECULAR, light_specular );}glEnable ( GL_LIGHTING );glEnable ( GL_LIGHT0 );glEnable ( GL_LIGHT1 );glEnable ( GL_LIGHT2 );rotCube.cのourDisplay()
voidourDisplay(void){GLfloat material_color[4]={1.0, 0.0, 0.0, 1.0};/*拡散光成分*/
GLfloat material_specular[4]={0.2, 0.2, 0.2, 1.0};/*鏡面光成分*//* バッファのクリア */glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);}/* 鏡面光成分のセット */glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);...
glLightfv ( GL_LIGHT0, GL_POSITION, light_position0 );glLightfv ( GL_LIGHT1, GL_POSITION, light_position1 );glLightfv ( GL_LIGHT1, GL_POSITION, light_position2 );...
/* レッド */glMaterialfv(GL_FRONT, GL_DIFFUSE, material_color);
drawFModel( &fCube );glFlush();まとめ•ビジュアル情報処理•2 モデリング•2.3 曲線・曲面•OpenGL•色の取り扱い•シェーディング
•照明モデルと照光処理