鏡面・構造色シェーディングを行う(UMU)
構造色とは、物体の表面の光の波長程度の微細な表面構造によって、入射した光が干渉しできる色のことである。
これはWikipediaの記事の画像をみてもわかるように、タマムシなどの生物や、シャボン玉(膜の厚みにより干渉する)、CDなどにも見れれる一般的な現象である。
そこで今回は、この構造色を持った面を描画する方法を考えた。
まず、CDを観察すると、CDは面でできており、面の色は光の反射による反射色と、光の干渉による構造色、およびCD自体の色の計3つより成り立っていると考えた。
よってCDを描画するには、この3つの色を描画することで、再現できる。
CD自体の色の描画は一般的な手法に頼るとして、問題は反射色と構造色である。
1.反射色
反射色は、次のように計算する。(これはシェーダを書いている訳ではない)
1.座標変換により鏡内世界空間を作り出す
正確にはカメラのMVP行列に細工をする。
カメラによって、次の計算がなされている。
screenPosition = P V M modelPosition
ここで、世界座標空間で鏡面に対して対象変換する行列をDとすれば、
鏡内世界空間でのscreenPositionは次のようになる
screenPositonInMirror = Pmodify V D M modelPosition
(注:Pmodify は、鏡の手前を描画しないために修正した行列である。)
なお、この変換によりポリゴンの裏表が反転するためこれを考慮する必要がある
2.鏡内世界空間を一時領域に描画し、それを実際の世界空間で用いる
1.によって作られた座標空間をもとに出力した画像を用いれば良い。
2.構造色
CDの構造色は、CDの円周方向に沿ってできた微細な凹凸によってできているよって、まずCDの微細構造を示した情報が必要となる。
よって微細構造テクスチャというものを作り出し、それをもとに干渉を計算する。
1.微細構造テクスチャ
微細構造テクスチャに必要な情報は次のようになる
・微細構造方向
・微細構造間隔
2.構造色の計算
微細構造が分かれば、干渉を計算できる。
干渉は、光の経路差により発生する。構造色は、光の波長により干渉の度合いが異なるため、個々の場所によって異なる波長が強め合うことになる。
ここでは近似的に 最も強まる光のみを表示することにして処理を軽くすることにした。
強め合う波長 λ を次のように計算した。
md|L-C|=nλ (m,n=1,2,3,…(計算上は有限にする))
ただし、
Lは、隣り合う微細構造がライトとなす経路差
Cは、隣り合う微細構造がカメラとなす経路差
dは隣あう微細構造の距離
n,mはそれぞれ経路差が波長の数倍になっても干渉するため、隣りの隣とも干渉するために導入する。
こうして計算した 波長λの光 を表示する。
Render Result:
以上の考えによりCDを描画した結果次のようになった。(n,m=1~4,d=1.6um)
微細構造テクスチャを変えてYoutubeにも投稿した。(HD画質推奨)
<終>
Posted on: 2015年9月16日, by : UMU