Transcript 04_shading

プログラミング演習3
李 亜民クラス
第4回
シェーディング
今回の内容

概念説明




作業


シェーディング
反射モデル
補間手法
Vertexクラス、Pixelクラス変更
課題について
概念説明
シェーディング
反射モデル
補間手法
3Dグラフィックスパイプライン
①
②
③
④
⑤
⑥
⑦
⑧
3Dモデル構築
モデル変換
バーテックス処理
ビューポート変換
バックフェースカリング
ラスタライズ
ピクセルシェーディング
Zバッファの適用
:第3回
:第1回
:第4回
:第1回
:第3回
:第2回
:第4回
:第3回
シェーディングとは?

ポリゴンに陰をつける

光源の位置とポリゴンの向きから、その部分の輝度を決める


1ピクセルずつの計算が必要
参考:Shadow(影)とShade(陰)

地面に落ちるのは影、光の当たっていない部分が暗くなるのは陰
反射モデル

輝度の計算モデル

Lambert反射モデル


Phong反射モデル



拡散反射
Lambert反射+ハイライト+環境光
その他にも用途別に様々なモデルが存在
この講義では、Phongの反射モデルを実装する。
Phongの反射モデル

𝑰𝑝 = 𝑘𝑎 𝒊𝑎 +
lights 𝒊 max 𝑳 ∙ 𝑵, 0 𝑘𝑑 𝒄 + max 𝑹 ∙ 𝑬, 0
𝛼
𝑘𝑠

光源色、複数光源、環境光などを考慮した式
複雑な上、パラメータが多すぎるので一部省略した式(次ペー
ジ)を用いることにする

省略内容



環境光を考慮しない
光源を単一に

光源輝度𝒊を(1,1,1)に固定
Phongの反射モデル(一部省略)

𝑰𝑝 = max 𝑳 ∙ 𝑵, 0 𝑘𝑑 𝒄 + max 𝑹 ∙ 𝑬, 0

𝑰𝑝 : 輝度(r,g,b)

𝑵 : 法線ベクトル
𝑳 : 光源ベクトル
𝑬 : 視点ベクトル
𝑹 : 反射ベクトル
材質設定








𝑘𝑑 : 拡散反射(Diffuse)係数
𝛼: 滑らかさ
𝛼
𝑘𝑠
𝑘𝑠 : 鏡面反射(Specular)係数
𝒄 :表面色(r,g,b)
𝑵, 𝑳, 𝑬, 𝑹は全て正規化済み(ノルム1)である必要がある。
r,g,bそれぞれの要素について別々に計算する。
Phongの反射モデル:ベクトルの扱い

使用するベクトルの定義されている座標系を統一する
light, eyeの位置をワールド座標で定義
Nにはモデル変換を施してワールド座標に
①
②

ただし、Nは方向ベクトルなので回転成分のみ適用
このN, light, eyeを元に、L, Eを計算(ワールド座標)
③


位置情報にはスクリーン変換を施すが、これらのベクトルには不要
Phong補間(後述)の場合、N, L, Eをラスタライズ時に補間
Rを計算し、シェーディング
④

このとき、位置情報はスクリーン座標系で、N,L,E,Rはワールド座標
系で定義されていることになる

位置情報はシェーディングに用いないので問題ない
Phongの反射モデル:材質設定

α : 大きいほど表面が滑らか(ハイライトが小さくなる)
α=5

α=20
α=50
共通パラメータ



半径100, 中心(0,0,0) light:(500,500,500) eye:(0,0,500)
ks:0.3 kd:0.6 ka:0.1
c:(0,1,1) ia:(1,1,1) i:(1,1,1)
補間手法

Flat


Gouroad(グーロー)


ポリゴン毎に色を決め、ポリゴン全体を単色で塗る
頂点ごとに色を決め、色を補間
Phong(フォン補間)

法線を補間し、ピクセルごとに色を決める
バーテックス/ピクセルへの処理内容

補間手法によって処理を切り替える

補間手法
バーテックス
ラスタライズ
ピクセル
Flat
面法線で
シェーディング
座標+色補間
補間色を
そのまま使用
Gouraud
頂点法線で
シェーディング
座標+色補間
補間色を
そのまま使用
Phong
法線等を計算
座標+法線等
補間
補間された法線で
シェーディング
ラスタライザで補間するパラメータは、反射モデルに依存する。

Phong補間ならばN, L, E
Phongシェーディング

Phong補間+Phong反射モデル


どちらもPhongが考案したもの
反射モデルを指してPhongシェーディングと呼ぶ場合も
Phongシェーディングの流れ
頂点・ポリゴンデータを用意(初回のみ)
モデル変換
N, L, Eベクトルを計算、Vertexに格納
スクリーン変換
バックフェースカリング
ラスタライズ(座標,N,L,E補間)
ピクセル毎のシェーディング
Zバッファ適用
作業
Pixel,Vertex修正
Pixel, Vertexを一部変更

メンバ変数追加


コンストラクタ


Vector N, L, E :法線、光源、始点ベクトル
任意に追加
メソッド

Pixel lerp(…) :N,L,Eの補間を追加
法線の扱いに注意

立方体など、同じ頂点であっても面によって法線方向が
異なる場合がある

面ごとに別々のVertexを定義するなどして対処

立方体の場合、Vertexが24個になる
第4回課題

1. Phongシェーディングを実現して下さい。



2. [発展] テクスチャマッピングを実現して下さい。




クラス名:lec04( Canvasを継承)
描画するモデルは、結果が解りやすいものを各自で選択
Vertex等にテクスチャ座標(U,V)を持たせる
シェーディングで色を取得する際に、テクスチャから色を取得
法線同様、面によってUVを分ける必要がある
3. [発展] 透視射影(遠近)を実現して下さい。


各自、本やWeb等を参考に挑戦してみてください。
テクスチャマッピングと同時に行う場合は、パースペクティブコ
レクトという操作が必要。
課題の実行イメージ

テクスチャマッピング+パースペクティブ

課題1の実行例についてはP.9等を参照のこと。