このページでは以下の書籍を紹介する.
IT Text コンピュータグラフィックスの基礎
宮崎 大輔, 床井 浩平, 結城 修, 吉田 典正
オーム社
2020年6月22日 発行
ISBN 978-4-274-22557-4
この書籍は情報処理学会IT Textシリーズの1つであり,CG(コンピュータグラフィックス)の教科書である.情報処理学会教科書編集委員会の発案で発行されることとなった書籍である.
宮崎大輔のページへ
結城修のページへ
床井浩平のページへ
吉田典正のページへ
(敬称略)
教科書はできるだけページ数が少ないほうが望ましい.そのため,ボツにした内容も多い.以下では,私の担当した「はしがき」「6章 質感付加」「7章 反射モデル」「8章 照明計算」「9章 レイトレーシング」「付録 行列」の中でボツにした内容を紹介する.なお,ボツにした部分のみを抽出しているため,前後の文のつながりが不自然であったり,十分に推敲されていなかったり,作図が雑だったりするが,気にしないでいただきたい.
一昔前のゲーム機では,事前にレンダリングしていたCGムービーを映像として流すことがあったが,現在ではそれ以上に美麗な3次元CGをリアルタイムで表現できるようになった.
本書は,コンピュータグラフィックスの基本アーキテクチャを解説したうえで,グラフィックスのパイプライン処理を説明し,色・光そして形状表現を学べるように構成されている.
なお,特定のプログラミング言語ではなく擬似コードを用いているのは,技術の多様化に伴いさまざまなプログラミング言語を使う必要性に対応し,今後登場するであろう新しいプログラミング言語にも対応できるようにする狙いがある.
本書の旧版が出版されたのは十数年前のことである.その間,CGの分野も目覚ましい発展をし,新しい技術も数多く開発された.そのような時代の流れを踏まえ,本書では表面下散乱やイメージベースドライティングなどのように近年発達したレンダリングの手法や,ゲームや仮想空間など様々な領域で使われるコンテンツ・オブジェクトの生成に関連するモデリングの基礎技術を解説する.一方,そのような時の流れを経ても,必要とされる普遍的な技術もある.激しい時代の変化に対応できる柔軟性を持つためのしっかりした基礎力を身につけることで,環境の変化に適応できる人材を育てることも本書の役割の一つである.
本書を送り出すいま,CGの教科書として想定以上の出来になったと自負している.とはいえ,いまやCGは膨大な分野となっており,すべてのCGの知識を詳細に記すことは不可能であり,本書ではカバーしきれない点も多くある.本書はあくまでも初学者にとっての基礎知識を学ぶための道具の一つであり,本書を学び終えた読者は他の書籍などからさらに多くの知識と技術を身に付けていただきたい.
マッピングでは,2次元画像と3次元形状との間の写像関係を用いて,2次元画像の座標系から3次元形状表面への座標系へ変換し,その後,ビュー変換とレンダリングを実施して表示する.
第7章でBRDF(双方向反射率分布関数)を紹介するが,それをテクスチャに拡張したものをBTF(双方向テクスチャ関数)という.現実そっくりの物体を表現する場合,その物体にあらゆる方向から光源を照射し,あらゆる方向から観測したデータそのものをテクスチャとして用いればよい.レンダリング時には,光源方向や観測方向が変わるたびに,その光源方向と観測方向で取得した画像を貼ることで現実そっくりの見えを再現することができる.これをBTFレンダリングという.
3次元形状の表面上の1点を2次元画像上の1点に対応させて,テクスチャマッピングの処理を行う.
テクスチャとは模様という意味であり,そのような物体属性を表す空間をソリッドスペースと呼ぶ.テクスチャマッピングの場合,テクスチャ画像が2次元画像であるため,s軸とt軸の2つの座標でソリッドスペースS(s,t)を表す.そのソリッドスペースSの点と,スクリーン座標 にマッピングされている物体上の各点が対応する.
この物体を空間オブジェクト座標(x,y,z)上に表示する場合
テクスチャマップMは
テクスチャ座標からジオメトリ座標へマッピングする
ジオメトリ座標からスクリーン座標へマッピングする
この2つのマッピングの合成として表される
ここで,幾何物体をパラメトリック面
で定義すると,この2つのマッピング処理を同時に行うことになる.すなわち,
テクスチャ座標からパラメトリック座標への変換
パラメトリック座標から幾何座標への変換
であり,次のようになる.
したがって,次の線形写像によって,テクスチャS(s,t)における点を面p(u,v)に写像できる.
線形写像では,テクスチャをパラメトリックパッチにマッピングすることが可能である.
図6・3では,立方体に四角形の画像を平行に投影する例を示す.立方体は6つの四角形からなるため,6つの四角形に対応する画像を用意する.レンダリング画像の座標(x,y)と区別するため,テクスチャ画像の座標は(u,v)で表現することが一般的である.図6・3の立方体の1つの面は4つの頂点から構成され,各頂点の1つにテクスチャ画像の点1つの(u,v)座標を付与させる.
拡散反射以外の効果も加味し,その点のレンダリング結果としてフレームバッファのその画素を上書きする.
ポリゴン内部の点の(u,v)座標を線形補間により計算するが,他の方法として,変換行列で計算する方法がある.例えば,三角形から三角形の変換はアフィン変換(2.4節)で表現できるため,三角形の内部の点もそのアフィン変換行列を使うことで計算することができる.点(x0,y0)と点(x1,y1)と点(x2,y2)からなる三角形を点(u0,v0)と点(u1,v1)と点(u2,v2)からなる三角形に変換するアフィン変換行列は同次座標を用いて以下のように計算される.
テクスチャ座標の割当てはモデルを作成する際に行われ,多くの場合,CGソフトにより割り当てる.
CGソフトによっては,3D形状モデルに直接,色を塗る機能が搭載されている場合がある.その際,色を塗った結果をテクスチャマッピング用の画像として出力する機能を備えたものもある.図6・5に示すように,その形状モデルのテクスチャを一枚の画像に展開したものをテクスチャアトラスという.テクスチャアトラスを自動出力する方法の多くは,少ないデータ量で多くの情報を表現するために,できる限り一枚の画像にくまなくテクスチャ情報を敷き詰めるようにする.
スマートフォン上で動作する3DCGアプリでは,スマートフォンの機能の制約から,複雑な処理をリアルタイムで計算することは難しい.そのため,大域照明(第8章)などの複雑な計算を事前に行い,そのレンダリング結果をテクスチャとして貼り付ける方法をとっている.この方法をテクスチャベイクという.事前に複雑なレンダリング結果をテクスチャにベイクしておく(焼き込んでおく)ことで,計算負荷をかけずテクスチャを貼るだけで複雑な陰影を表現することができる.
表面上の点の3次元座標と2次元座標がすでに対応づけられた形状データの場合,その座標をテクスチャ座標として利用する.第5章で説明したパラメトリック曲面は,パラメータuとvに応じて点の座標が表現される曲面である.その(u,v)座標をテクスチャ座標としてそのまま使うことができる(図6・6).
テッセレーションを行ったあと,高さマップに応じて三角形の座標を変形する.最新のCGライブラリではリアルタイムで計算することが可能だが,ディスプレースメントマッピングの代わりに視差マッピングが用いられることがある.法線マッピングやバンプマッピングでは平面的に凹凸情報がマッピングされるが,高さが存在する場合,その分,参照すべきテクスチャ座標がずれるべきである.すなわち,形状をずらす代わりに視線をずらすことで,あたかもポリゴン平面に凹凸があるように見せることができる.この視差マッピングを用いると,小さい計算負荷でディスプレースメントマッピングとほぼ同等の見え方を表現することができるが,あくまでテクスチャ座標をずらしているだけで形状そのものを変形しているわけではないため,物体の境界部分では(図6・10に示した法線マッピングの例と同様に)凹凸が正しく表現されない.
ソリッドモデルは,物体の内外を区別するための情報をもち,中身の詰まった物体を表現できた.さらに,3次元空間でテクスチャを定義することにより,物体の内部までテクスチャで表現する方法がソリッドテクスチャリングである.ボリュームデータがあればそれを利用する.
ソリッドテクスチャリングは,3次元のソリッドスペースSから3次元の座標()へのマッピングとして表す.テクスチャ座標からデカルト座標へのマッピングMTについては,一般に=を用いることが多い.処理方法は,テクスチャマッピングの処理方法を2次元から3次元に拡張するだけである.
図6・15にソリッドテクスチャリングの例を示す.図6・15 (a)はスイカのように,中心からある距離までは赤,それより外は緑でレンダリングした画像である.図6・15 (b)は中央から外に向かって,赤,シアン,緑,黄色,赤,となだらかに変わる色でレンダリングした画像である.図6・15 (c)はチェッカーボードのように交互に黒と白を配色してレンダリングした画像である.図6・15 (d)は大理石のように自然で複雑な模様のついた材質をレンダリングした画像である.
問4 図6・15(c)に示した3次元的に表現されたチェスボードのようなパターンを生成するための数式を示せ.3次元座標x,y,z を入力とし,「白」または「黒」を出力とする.
問6 サイコロにテクスチャを貼り付けた状態のobjファイルを作成せよ.
問4
ただし,Bはブロックの一辺の長さを表す.また, は小数点以下切り捨てを表し,%は剰余を表し,==は等値演算子を表す.
問6
解の一例を示す.図6・3と同様のテクスチャ画像を用意し,そのファイル名がdice.bmpだとする.つづいて,dice.mtlというテキストファイルを作成し,その内容を以下の通りにする.
newmtl dice
map_Kd dice.bmp
Ka 0 0 0
Kd 1 1 1
Ks 0 0 0
Ns 1
d 1
つづいて,dice.objというテキストファイルを作成し,その内容を以下の通りにする.
mtllib dice.mtl
usemtl dice
v -1 -1 1
v 1 -1 1
v 1 1 1
v -1 1 1
v -1 -1 -1
v 1 -1 -1
v 1 1 -1
v -1 1 -1
vt 0.25 0.75
vt 0.25 0.5
vt 0.5 0.5
vt 0.5 0.75
vt 0.0 0.75
vt 0.0 0.5
vt 0.25 0.25
vt 0.5 0.25
vt 0.75 0.5
vt 0.75 0.75
vt 0.5 1.0
vt 0.25 1.0
vt 0.5 0.0
vt 0.25 0.0
f 1/1 2/2 3/3 4/4
f 2/2 6/7 7/8 3/3
f 3/3 7/9 8/10 4/4
f 4/4 8/11 5/12 1/1
f 1/1 5/5 6/6 2/2
f 8/13 7/8 6/7 5/14
上記の例の場合,頂点番号とテクスチャ座標値番号の対応関係はややこしい.その理由の一つは,上記の例では,実際に紙を折ってサイコロを作ることができるような展開図をテクスチャ画像として用いているからである.CGは現実に存在しないデジタルデータであるため,現実には折ることのできないテクスチャ座標を設定しても何ら問題はない.実際に折ることができなくても,わかりやすさを優先したテクスチャ座標を設定すべきである.理由のもう一つは,無駄なく頂点番号やテクスチャ座標値番号を活用しているからである.例えデータの一部が重複してファイルサイズが大きくなったとしても,わかりやすさを優先したほうがいい場合もある.わかりやすさを最優先にしたサイコロのobjファイルの作成は読者への宿題とする.
光のエネルギーは放射輝度(ラディアンス)で表す.放射輝度Lは,
方向に進む,点xからの光エネルギーを表す.点xが発光する放射輝度を
とし,点xで反射した光の放射輝度を
とすると,その2つの和が点xから方向に進む出射光の放射輝度
となる.
反射光
は,あらゆる方向から点xに入射する光
を全て受け取り,その総エネルギーの一部が反射したものである.反射するエネルギーの割合を表した反射率
をBRDFといい,7.2節で説明する.すなわち,出射光の放射輝度は以下のレンダリング方程式(表現方程式)で表される.
この式は点xから 方向への出射光 を表している. 方向に進む光 はランバートの法則(7.4節1項参照)を表す にしたがった割合で点xへ入射する. は法線であり, は入射光の立体角である.入射光はの割合で方向に反射する.入射光の全ての方向に対して積分して得られた反射光に,発光エネルギーが加算されたものが出射光である.
式(7・2)のレンダリング方程式により,物体表面の反射光を観測したときの明るさを計算することができる.
この章では,レンダリング方程式を具体的な数式でモデル化して明るさを表現する方法を説明する.反射光の表現の例を以下に示す.
ここで,第1項は環境光,第2項は拡散反射光,第3項は鏡面反射光を表し,7.2節で説明する.第2項は7.3節で示すランバート反射モデルであり,第3項は7.4節で示すフォン反射モデルである.このような数式により物体表面の反射をモデル化する.
なお,n,l,r,v,はそれぞれ,法線,光源方向,正反射方向,視点方向である(図7・11).Iは観測輝度で は光源輝度である.rは物体表面の点と光源までの距離であり,αは表面の粗さを表すパラメータである. , , ,はそれぞれ環境光,拡散反射光,鏡面反射光の反射率を表す.
式(7・4)に示すBRDF は,入射光の放射輝度 が反射して出射光の放射輝度 になる割合を表す.ここで はランバートの法則(7.4節1項参照)であり,入射方向 と物体表面の法線 の内積である.
また, は入射光の立体角を表す.立体角とは,二次元における角度を三次元に拡張した概念であり,球の半径をr ,面積をSとしたとき, が立体角となる.立体角の単位は[sr](ステラジアン)である.
BRDFにはヘルムホルツの相反性が成り立つ.この相反性は,式(7・4)の と を入れ替えても成立することを意味する.
現実そっくりの物体を表現するために,その物体にあらゆる方向から光源を照射し,あらゆる方向から観測したデータそのものをBRDFとして用いる方法がある.その場合,データの取得が必要であるため,データを取得するための装置が必要であることや,計測装置の都合で計測できない箇所を表現することができないこと,正確なデータを取得するためのノウハウが必要であること,そのデータを格納するメモリが必要であること,現実に存在する材質しか表現できないこと,などの問題点がある.一方,BRDFを数式で表現し,数式のパラメータを変更することでさまざまな見えを表現することができれば,先程の問題点を解決することができる.この章では,数式で表現されたBRDFを紹介する.
BRDFを計測する装置としては南カリフォルニア大学のPaul Debevecの研究チームが作ったLightStageなどがある.また,計測済みのBRDFデータを公開しているところもあり,例えばMERL(三菱電機リサーチラボラトリーズ)のBRDFデータベースなどがある.
理想的なランバート反射のみを発生させる物体表面を完全拡散面やランバート面ということもある.カメラによる撮影時など,基準となる色を事前に撮影する際,ランバート面をもつ物を対象とすることがある.その際に用いられる標準器としては,Labsphere社の標準反射板やX-Rite社のカラーチェッカーなどがある.
これらを省略し,Dの代わりにn∙hのα乗で鏡面反射を表現した以下の式をブリン・フォン反射モデルという.
鏡面反射モデルとしてラフォーチュン反射モデルというものもある.このモデルでは,さまざまな反射を表現することでき,等方性反射のみならず異方性反射も表現することができる.拡散反射も表現することができ,また,トランス・スパロウ反射モデルやウォード反射モデルでも表現できない複雑な鏡面反射も表現することができる.汎用性の高いモデルとして利用されることが多くなってきている.
問5
のとき,以下のそれぞれの法線ベクトルおよび接ベクトルに対してウォード反射モデルの輝度Iを求めよ.
(1)
,
,
(2)
,
,
(3)
,
,
(4)
,
,
(5)
,
,
(6)
,
,
(7)
,
,
(8)
,
,
(9)
,
,
(10)
,
,
(11)
,
,
(12)
,
,
(13)
,
,
(14)
,
,
問6 フォン反射モデルとブリン・フォン反射モデルのピーク位置が同じであることを証明せよ.
問5
(1) I=0.0009
(2) I=0.0381
(3) I=0.3718
(4) I=0.7958
(5) I=0.3718
(6) I=0.0381
(7) I=0.0009
(8) I=0.7434
(9) I=0.7720
(10) I=0.7897
(11) I=0.7958
(12) I=0.7897
(13) I=0.7720
(14) I=0.7434
問6
フォン反射モデルの輝度が最大となる方向は正反射方向であり,ブリン・フォン反射モデルの輝度が最大となる方向も正反射方向であるため,明らか.以降,一応念のため,式を変形して確認する.2つの単位ベクトル同士の内積は-1~1
であるため,最大値は1であり,そのときの2つのベクトルは一致する.よって,フォン反射モデルの輝度が最大となる角度はr∙v=1すなわちr=vであり,ブリン・フォン反射モデルの輝度が最大となる角度はn∙h=1すなわちn=hである.それぞれのベクトルの間には以下の関係がある.
よって,ブリン・フォン反射モデルの輝度が最大となる条件は以下の通りである.
この式は,vのスカラー倍がrに一致することを表している,すなわちvとrは平行である(同一直線上に載る)が,vもrも単位ベクトルでありr∙v>0であるため,この式が満たされるのはr=vのときだけである.この条件はフォン反射モデルの輝度が最大となる条件と一致するため,この2つの反射モデルのピーク位置は同じである.
(2)の解決策は,単純にはシャドウマップの解像度を高めることであるが,高解像度のデプスマップへの描画は計算時間とメモリ使用量の両面で問題がある.そこで例えば,シャドウマップ中にできるだけ大きく物体が表示されるように座標変換を行ってからシャドウマップに記録する,遠近に応じて複数枚のシャドウマップを用いる,などさまざまな方法が考案されている.また,シャドウマッピングは,本来はハードシャドウのためのアルゴリズムであるが,ジャギーを軽減しつつソフトシャドウを近似するために,シャドウマップを複数回サンプリングしたのち,ボックスフィルタをかけて境界をぼかす,という方法もある.
シャドウボリューム法の利点は前述の通り,影の輪郭にジャギーが生じないという点である.しかしシャドウボリュームを構成するポリゴンを計算する際に,遮蔽物体の輪郭が細かく分割されていると,シャドウボリュームのポリゴンも細かくなり,その生成コストおよび描画コストが大きくなる.最近のGPUには描画時に動的にポリゴンを生成する機能があり,シャドウボリュームの計算も従来よりも高速に行える.しかし,あまり細かすぎると描画処理のボトルネックとなりうる.
ここまで述べたシャドウマッピングとシャドウボリューム法は,境界のはっきりした影であるハードシャドウを計算するアルゴリズムであった.
では,境界のぼやけたソフトシャドウを計算するにはどうしたらよいだろうか.ソフトシャドウが生じるのは,物体から見て面積をもつような光源,つまり無数の点光源の集合で照らされた場合である.
単純には,無数の点光源を有限の点光源で近似し,光源位置をずらしながらハードシャドウのアルゴリズムを何度も適用しつつ照明計算を行い,照らされた各画素の輝度値の総和を取ればよい.
近似に用いる点光源の数が少なければ,ハードシャドウに由来するはっきりした影が視認できるが,数十,数百と点光源の数を増やしていけば自然なソフトシャドウが得られる.
ただし,このような単純なソフトシャドウの計算は,計算負荷が高く,リアルタイム処理には向かない.例えば,光源が単純な多角形からなる面光源で,遮蔽物体が直方体のような単純な形状であれば,ソフトシャドウの半影部分の明るさを解析的に求めることもできる.しかし,現実にはそのような単純なシーンはほとんどない.
リアルタイム向けでは,基本的にはハードシャドウをフィルタリングによってぼかすことによってソフトシャドウを実現する.ただし,やみくもにぼかせばよいわけではない.例えば平面上に直立した棒があるとして,棒のすぐ近くに生じる影はハードシャドウに近い境界の比較的はっきりした影になるが,棒から離れるにしたがってぼかし度合いの大きな半影となっていく.このように場所に応じてぼかし度合いを変えていく必要があり,さまざまな方法が考案されている.
シーンの規模が大きくなるとパッチ数が増え,連立一次方程式(式(8・2))のサイズが大きくなり,計算に時間がかかる.連立一次方程式を解くのではなく,各ステップで最大の光のエネルギーをもつパッチから順に光エネルギーを放出させる,という漸次ラジオシティ法も提案された.
また,フォームファクタの計算は,遮蔽の計算を含み計算コストがかかるため,ハードウェアを利用して高速化する方法としてヘミキューブ法も提案された.これは,光エネルギーを放出するパッチを中心として単位半球を配置し,その半球面上に他のパッチを投影した面積の比率から各パッチのフォームファクタが求められる,という性質を利用したものである.半球のかわりに,単位立方体を半分に切ったヘミキューブを配置し,ヘミキューブの各面をスクリーンと見なして周囲のパッチを射影し,面積を計算する.このヘミキューブへの投影は,シャドウマッピングと同じくエイリアシングの問題があり,ヘミキューブの解像度が十分でなければ小さなパッチのフォームファクタの計算が精度よく行えない.
一般的なカメラでは,明るさが8ビットで表現され,0~255の256段階で表される.このように,表現できる明るさの範囲をダイナミックレンジと言う.
ここで,明るい光をカメラで撮影したとしても図8・10のように色が白く抜けてしまうことがある.これは,明るさが一定以上になると,その明るさがダイナミックレンジの上限の255として記録されてしまい,本当の明るさが記録されない状態となることによる.このように,撮影された画像が明るすぎて,正しい明るさが記録されない状態を飽和(サチュレーション),あるいは白飛びや露出オーバーと呼ぶ.
明るい画像を撮影できるようにカメラを設定して撮影した場合,すなわち,露光時間を長く設定して撮影した場合,暗い部分は明るくなってディテールが分かるようになるが,明るい部分は白飛び,すなわちサチュレーションを起こし,正しい明るさが記録できない.カメラの設定で暗くして一般のシーンを撮影した場合,明るい部分は正しく撮影できるが,暗い部分は精度が悪く,信頼できない映像が得られる.
これに対し,例えば,図8・11のように,露光時間の異なる4枚の画像を利用することにより,露光時間を短くして撮影した画像の明るい部分を使い,露光時間を長くして撮影した画像の暗い部分を使うことで,明るい部分も暗い部分も精彩に表現できる写真を作ることができる.
いま,露光時間(シャッタースピード)を変えて撮影した複数枚の画像の画素に着目する.横軸を露光時間,縦軸を明るさとした図8・11のグラフのように,暗い画素においては,露光時間に線形に比例して明るくなるが,明るい画素においては,図8・11のように,明るさの傾きが大きくなり,露光時間がある程度まで長くすると明るさが飽和する.図8・11の直線の傾きが明るさを表す.飽和していないサンプリング点のみから直線を当てはめることで,ダイナミックレンジを超える明るさを得ることができる.
これが,ダイナミックレンジを超えて明るさを表現した画像,すなわち,HDR(ハイダイナミックレンジ)画像である.一般的なカメラは8ビットで階調を表現するため,この場合は256段階を超えて明るさを表現できる画像がHDR画像となる.HDR画像では,一般的には画素値を整数ではなく浮動小数で表現する.
カメラで撮影する場合,カメラが撮影するシーンの明るさを勝手に修正しないようにするため,自動露出機能(オートエクスポージャー)や光源色補正(オートホワイトバランス)などの機能はオフにして撮影する.また,カメラのガンマ特性は1に設定する.ガンマ変換とは,以下の式で明るさx
を明るさy に変換する処理のことである.
カメラのガンマ特性はγ=0.45 であることが多い.これは,ディスプレイのガンマ特性はγ=2.2 であることが多く,カメラで撮影した画像をディスプレイ上で表示して肉眼で見たときに正しい階調の写真であるように知覚できるようにするためである.しかし,現実の光のエネルギーとして物理学的に正しい明るさを記録するためには,カメラの設定を操作し,ガンマ特性を1に設定する必要がある.
JPEGファイルで記録すると圧縮に伴う誤差が生じることや,カメラが自動的に見栄えをよくするための画像処理を適用する可能性があるため,画像は生データ(rawデータ)として記録する.カメラと対象を固定した静的シーンに対して,露光時間を変えて複数枚の画像を撮影する.
ガンマ特性を1としたとき,HDRを計算する具体例を以下に示す.
この場合,露光時間に比例して明るさが変化するため,原理は単純である.露光時間を変えて複数枚の画像を撮影し,それぞれの画像を露光時間で除算し,その平均を計算することでHDR画像を得る.その際,暗すぎる画素や明るすぎる画像は信頼性が低いため,計算から除外する.
例えば,図8・11のように露光時間を変えて4枚撮影したとする.ある露光時間で撮影された画像のある画素の明るさを
とし,その2倍,4倍,8倍の露光時間で撮影された画像を
,
,
とする.4つの明るさが適切な範囲(例えば,15~240)に含まれる場合は以下の式でHDRの輝度が計算できる.
その際,例えば
が適切な明るさの範囲に含まれなかったとすると,残りの明るさから以下のように計算する.
現在,HDR画像を作成するフリーソフトがいくつか存在し,それらのフリーソフトではガンマ特性を1に設定しなくてもHDR画像を作成することができる機能も搭載されていることが多い.
球を撮影すると円になるが,その円を単位円とし,原点を円の中心とした場合,図6・14に示すように,円上の点の位置
はその球の単位法線ベクトル
と以下のように対応している.
この場合,原点の法線は(0,0,1)となる座標系であるため,得られた法線から,金属表面で反射した光のベクトル もわかる.その反射ベクトルの先に存在する光が画像上の点に映り込んでいることになる.これは,6.3節2項で説明した通りである.
イメージベースドライティングにおける環境マップはHDR画像を用いる.周囲の環境では,光源など明るさの大きい領域が含まれるため,HDR画像で表現することが適している.環境の画像を光源として使うことで,その光源環境のもとでのCGを再現することができる.
リアルタイムレンダリングの際,光源の数を減らす必要がある.光源環境の解像度が高いとリアルタイムでの計算は難しい.
1つは,無限遠点光源(平行光源)の集合で表現する方法である.明るい部分ほどより多くの点光源を配置し,暗い部分には少数の点光源を配置するなど,重点的にサンプリングした光源群を環境マップから作成する.その光源群のもとでレンダリングを行うことで,その光源環境のもとでのCGを作成することができる.
球面調和関数の代わりにウェーブレット基底を用いることで,高周波成分も表現できるようにした手法も提案されている.
問1 デジタルカメラを三脚に固定し,カメラの露光の設定を変えて複数枚の画像を撮影し,同じ画素における輝度をグラフにプロットせよ.ガンマ特性や自動露光やオートホワイトバランスなど,カメラの設定を変えることでどのようなグラフになるか確認せよ.また,NDフィルタを通して撮影した場合についても確認せよ.
問1 解答略
7.1節で示した通り,BRDFにはヘルムホルツの相反性が成り立つため,カメラからレイを飛ばしても,光源からレイを飛ばした場合と同じ見え方が実現される.
球との交点の計算は,レイトレーシング法の高速化に利用されている.物体を囲うバウンディングボリューム(9.4節参照)として球を用いることが多い.
これまで述べたように,CGでは物体形状を表現するのに,各面が三角形からなる多面体(三角形メッシュ)で表現されることが多い.そのため,レイトレーシングにおいてレイと三角形の交差判定は重要である.
以降では,図9・4の三角形
,
,
に対して説明する.法線ベクトル
は平面と直交するため,平面上の線分も法線ベクトルと直交する.三角形の頂点
から平面上の点
に伸ばした線分は平面上に含まれるため,法線ベクトルと直交する.その条件を満たす
が平面上の点である.
式(9・9)の は , , のいずれかを用いる.
交点
を求めるため式(9・1)を式(9・9)に代入することで,以下のようにtが求まる.
t>0のとき,交点が観測され,t≤0のときは,交点が視線方向とは逆の方向に存在する.
交点が得られたのち,その交点が三角形の内部にあるかどうかを判定する必要がある.この三角形を図9・5のように,三角形1と三角形2と三角形3に分けて考える.
交点を とする.通常,この交点 や三角形の頂点は投影変換されたあとの点を用いるが,世界座標系における点で計算してもよい.
三角形1は点
,点
,点
,三角形2は点
,点
,点
,三角形3は点
,点
,点
からなる.それぞれの三角形の法線
,
,
を以下のようにベクトルの外積を用いて計算する.
このとき, , , が全て同じ向きであれば,交点 はこの三角形の内部であると判断できる.一方,図9・5(b)のように,向きがすべて同じとならない場合,交点 は三角形の外部にあることになる.
三角形の単位法線ベクトル
はベクトルの外積で計算できる.三角形の頂点を
,
,
とすると,法線ベクトルは,4.2節で示した通り,
から
に向かうベクトルと,
から
に向かうベクトルの外積で定まる.
図9・7にあるように,法線ベクトルは三角形に直交していなければいけないが,式(9・27)のようにベクトルの外積を計算することで, から に向かうベクトルと直交し,なおかつ, から に向かうベクトルとも直交するベクトルを計算することができる.三角形の頂点の番号 , , の順番が反時計回りとなる向きが表であるという定義と,式(9・28)により得られる法線の向きは一致する.
レイトレーシング法は一つの光路につきレイを一本飛ばすが,分散レイトレーシングは,一つの光路の途中で,レイを二本以上,異なる方向に飛ばす方法である.分散レイトレーシング法の応用例として,アンチエイリアシング(スーパーサンプリング)のほかに,ソフトシャドウ(図8・2参照),被写界深度,モーションブラー,にぶい鏡面反射,間接照明がある.例えばソフトシャドウの場合,描画対象の物体表面上の点からレイを周囲に飛ばし,それぞれのレイが光源に到達するか遮蔽されるかを判定した結果を統合することでソフトシャドウ(半影)を表現することができる.8.4節2項で大域照明について説明した際の図8・13に示した原理で半影を表現していることになる.
スーパーサンプリングによるアンチエイリアシングも分散レイトレーシングといえる.通常のレイトレーシング法では,1つの画素につき1つのレイを飛ばすが,その際,レンダリング画像では図9・13(a)のように,直線において階段状のジャギーが発生する.これを防ぐため,1画素に対して複数のレイを飛ばし,それらのレイで計算した輝度の平均を計算することで,ジャギーのない図9・13(b)のような画像を生成する.
レイトレーシング法で最も計算時間のかかる処理は,9.2節で示したレイと物体の交点計算である.そのため,不要な交点計算を省くことで,レイトレーシング法の高速化を行う方法が考案されている.交差判定を省く方法として,バウンディングボリュームを用いた方法と空間分割法がある.
レイトレーシング法の高速化の一つとしてバウンディングボリュームを用いた方法がある.バウンディングボリュームは,物体を囲む簡単な立体である.まず,バウンディングボリュームとレイが交差するか判定し,交差する場合はその中に含まれる物体の各ポリゴンとレイの交差判定をおこなう.図9・14の例で説明すると,レイAとバウンディングボリュームの交差判定した際,交差しないことがわかったとき,この物体の全ポリゴンとの交差判定を省くことができる.レイBとレイCはバウンディングボリュームと交差するため,その物体との交差判定を行う必要がある.レイBのように物体と交差する場合もあれば,レイCのように物体と交差しない場合もある
レイトレーシング法の高速化の一つとして空間分割法がある.図9・15のように,あらかじめ空間を分割し,各空間に存在する物体を記憶しておく.レイが通過するボクセルに存在する物体のみと交差判定をすればよい.これによって,交差する可能性のない物体との交差判定を省くことができる.
パストレーシング(経路追跡法)は,1986年にJim Kajiyaによって提案された,任意の光の経路L (D|S)*
Eを扱える初めての大域照明アルゴリズムである.パストレーシングについては次節で詳しく述べるが,このパストレーシングのアルゴリズムとともに,大域照明を物理的に説明する方程式であるレンダリング方程式が提案された.レンダリング方程式は,式(7・2)で示した通り,以下で表される.
7.1節で説明した通り,レンダリング方程式は出射光の放射輝度,すなわち,観測光の放射輝度を表す式である.入射光 がBRDF の割合に応じて反射する光が,法線 で定義される半球面Ωのあらゆる方向 に対して積分されたものが反射光である.その反射光と,発光する光 を加算したものが,出射光の明るさ となる.
式(7・2)と式(9・43)は同じ方程式だが,式(7・2)と異なり,式(9・43)では可視判定を明示的に表現している. は可視関数と呼ばれ,入射方向 の光が物体表面に届く前に遮られれば 0,そうでなければ 1 を返す.また,法線 と方向 の内積が負となることを避けるため, ではなく と表している.
式(9・43)の左辺に出射光 があり,右辺に入射光 がある通り,レンダリング方程式は再帰的に定義されている.これは,入射光 も式(9・43)における出射光として計算されなければならないことを意味する.すなわち,別の物体表面上の点においても,様々な方向から入射した光が積算されて出射光が計算されるが,その出射光は別の点における入射光となることになる.
式(9・43)のレンダリング方程式を計算するためには無限個の積分の総和を計算しなければいけない.すなわち,全ての光の経路を計算し,その全ての光の授受を計算する必要があるということである.
フォトンマップ法のステップ1としては,光源からフォトンを飛ばし,拡散反射面に当たるまで追跡する.ステップ2では,通常のレイトレーシングを行い,物体表面に残留しているフォトンをかき集めて各画素の明るさを計算する.
例題: 3次元の点 , , , が同一平面上にあり,それらが2次元に投影されたときの座標を , , , とする.点 は三角形 , , の内部にあるか外部にあるか.
解答:
式(9・11)~(9・13)による判定は,点が3次元でも2次元でも利用可能である.2次元に投影されて計算されたZ値を使って3次元の座標として2次元投影点を利用する場合でも,z=0
として2次元投影点を利用する場合でも適用可能である(全ての点が同一直線上に投影された場合などは適用できない).z=0 とすると,以下により,外部が解.
aが単位ベクトルでbが任意の長さのベクトルであるとする.このとき,aの方向の直線に対してbの先端を垂直におろした点の長さは,aとbの内積と一致する(図A・2).
直交行列ではない行列を直交行列にする処理を直交化という.例えば,プログラム実行中に回転行列に計算誤差が蓄積していき,直交行列としての性質を満たさない行列になってしまったとする.その行列を直交化して直交行列にすることで,回転行列の性質を満たす行列に変換することができる.
逆行列どうしの乗算には
という性質がある.逆行列の具体例を以下に示す.
ただし,
は回転行列とし,
,
,
は以下の通りとする.
角度α〔°〕とラジアンβ〔rad〕には以下の関係がある.
表A・1に代表的な値を示す.ただし,nを任意の整数としたとき,α〔°〕とα+360n〔°〕は幾何学的に同じ角度を表し,β〔rad〕とβ+2nπ〔rad〕は幾何学的に同じ角度を表す.
図A・4に原点を中心とした単位円を示す.原点から単位円上の点Pまでのベクトルをpとする.ベクトルpとx 軸のなす角をθとし,ベクトルpが+x軸に存在するときのθを0とし,+x軸から+y軸に向かう方向にθが増加するものと定義する.このとき,ベクトルpのx座標はcosθ,y座標はsinθとなる.sin関数とcos関数のグラフを図A・5に示す.
代表的なsinとcosの値を表A・2に示す.角度θとsin関数およびcos関数の値の間には以下の関係がある.
また,tan関数とsin関数とcos関数の関係は以下の通りである.
三角関数に関する極限の値として以下の2つを例として挙げる.
sin関数,cos関数,tan関数の逆関数は,arcsin関数,arccos関数,arctan関数であり,それぞれ,
,
,
と表記する.y=sinθおよびx=cosθのとき,arcsin関数だけ,またはarccos関数だけではπ〔rad〕の範囲でしか角度θを求めることができない.一方,arctan関数を使えば,2π〔rad〕の範囲でθを求めることができる.すなわち,y=sinθ,x=cosθ,x≠0のとき,以下が成り立つ.
ここで,nは任意の整数である.上記の式はx=0のときに成り立たない.多くのプログラミング言語では,0による除算を避けてarctanを計算する関数が用意されていることが多い.例えば,C言語,Java,Processing,MATLAB,Pythonのmathではatan2関数が,Pythonのnumpyではarctan2関数が用意されており,以下のように計算される.
角度θが2π〔rad〕のうちのどの範囲の値を返すかはプログラミング言語とライブラリの仕様に依存する.