Japanese memo of Inigo Quilez's "Elevated" demo
概要
- 2009 年に Inigo Quilez (通称 iq) さんが作った "Elevated" というプログラムサイズが 4k のデモ(下の動画を参照)があります.
- これの資料を読んでいて, 内容的に面白かったので部分的にメモを書こうと思います.
参照 URL
- 資料 "behind elevated" by iq. 2009.
- Elevated の ShaderToy 版
メモ
レイマーチと 三角メッシュによるラスタライズについて
- (A) レイマーチの特徴
- × 興味深いジオメトリを作るのが苦手(プリミティブを改造したものになりがち)
- ○ レイマーチベースのシェーディング(リフレクションや AO)は簡単. 詳しくは iq さんの web 記事を参照.
- (B) 三角形メッシュによるジオメトリの特徴
- ○ 今までとおり, 興味深いジオメトリを作るのが得意
- × リフレクションや SSAO といったシェーディングは苦手
- (C) Elevated デモの場合
- 明らかに CG っぽいものを脱したかった
- (カメラからの)プライマリレイのヒット判定はラスタライザと Z バッファを使って行う
- その後, 画面全体へのプロシージャルテクスチャとシェーディングを適用 (ディファード・シェーディング)
Elevated の狙い
- リアルタイムのデモ
- 実際のカメラで撮影されているように見せる
- フリッカー( 蛍光灯やブラウン管を用いたディスプレイに生じる細かいちらつき現象. http://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%83%E3%82%AB%E3%83%BC )・フィルムグレイン・モーションブラーを 25 Hz にする
- 最終的には, 70 年代のカメラ風にした. 下図は順にポストエフェクトの適用前と適用後.
- カメラの動きも本物っぽくする
- × シンプルな sin, cos カーブ
- カメラの重みや慣性, 揺れを考慮
ノイズ
- ShaderToy 版の Elevated では 山用のハイトマップの高さ, 法線を計算するといった箇所にノイズ関数を使っています.
- もう少し詳しく言うと, 使用しているノイズ関数とその箇所によって以下のように分類できます.
- 改良型の fBm : 山用のハイトマップの高さ, 法線
- 通常の fBm : 雪のマテリアル, 空の雲
- Perlin Noise , fBm, 勾配ベクトルについては下の サイトの説明がわかりやすかったです.
- Understanding Perlin Noise(flafla2's soapbox): http://flafla2.github.io/2014/08/09/perlinnoise.html
- 3D の Perlin Noise は格子点(a,b,c,d,e,f,g,h)のそれぞれに与えられた乱数を, トライリニア補間した結果を返します.
- このときに使う補間の方法としては主に cubic 補間 か quintic 補間を使います.
- リニア補間 : u(x) = x
- cubic 補間 : u(x) = 3 * x^2 - 2 * x^3
- qunitic 補間 : u(x) = 6 * x^5 - 15 * x^4 + 10 * x^3
- 通常の fBm は 入力 x,z に対して, Perlin ノイズを重ね合わせた和である n(x,z)を返します.
- 一方で, 改良型の fBm では入力 x,z に対して, 上の n(x,z) だけでなく, x 方向の微分値 dn(x,z) / dx と z 方向の微分値 dn(x,z) / dz を返します.
- この微分値(ノイズの勾配)を考慮した場合, 通常の fBm よりも良い結果が得られます.
- 改良型の fBm については下の記事にきちんとした説明が載っています.
- Elevated の ShaderToy 版のソースコードを読むと, ホワイトノイズのテクスチャ(256x256)から改良型 fBm を noised() という関数で計算しています.
- またこの中で使用している補間関数は cubic 補間( u(x) = 3 * x^2 - 2 * x^3 )です.