iOS で SceneKit を試す(Swift 3) その62 - Scene Editor で Ambient Occlusion のテクスチャを作成する
Scene Editor ではジオメトリに対して Ambient Occlusion 用のテクスチャを焼き付け画像ファイルを作成することができる。
Ambient Occlusion とは?
周辺の光が塞がれて届かない隅のポリゴンに対して陰を着色することで物体をリアルに見せる技術。
SceneKit では Model I/O フレームワークの機能から呼び出す。
光学的に Ambient Occlusion は、実際の世界では起こらないため擬似的なものである。
Ambient Occlusion のパラメーター
Scene Editor でジオメトリを選択し、
Attributes Inspector (Command + Option + 4) を開き、一番下に Baking の項目がある。
Scene Editor では以下のパラメーター。
Type
- Ambient Occlusion
- Light Map
Ambient Occlusion が初期値。
今回はこちらを指定。
Destination
- Vertex
- Texture
Vertex 頂点にカラー情報を焼き込み、
Texture はテクスチャ画像を作成する。
作成後、Geometry Sources に
Vertex の場合 Color 情報、Texture の場合 Texture coordinates (UV 情報) が追加される。
Quality
初期値は 0.5。
画像のクオリティを決める。
0.5 は 512 x 512 の画像が作成される。
0.1 刻みでテクスチャ画像のサイズが倍になる。
0.6 で 1024 x 1024 になるが、この値を上げた分だけ画像生成に時間がかかるのようになるので注意。
Destination で Vertex の場合、この項目は無視される。
Attenuation
適応度合い。
値を低くすると陰の部分が濃くなる。
Bake ボタン
Bake ボタンを押すと実行される。
試してみる
準備
いつも通り、Xcode で iOS の Game テンプレートを作成し、ship.scn を開き Scene Editor を表示させる。
Object Library (Command + Control + Option + 3) から Ambient Light を配置し、宇宙船のジオメトリ shipMesh を選択。
わかりやすくするため、Material Inspector (Command + Option + 3) で Lighting model で Physically Based、Diffuse を白にする。
まず Vertex を試してみる
初期値は Vertex のままなので、Attributes Inspector の下の Bake ボタンを押す。
陰が描画されるとわかる。
Color が追加され、Inspector の目のアイコンから状態を確認すると、頂点に色が追加されているのがわかる。
Diffuse で元のテクスチャを適応するうっすら陰がポリゴンの継ぎ目に落ちている。
Texture を作成する
Destination で Texture に変更し Bake ボタンを押す。
テクスチャ画像作成後、自動的に Texture coordinates による UV 情報が付加され、マテリアルの Occlusion に作成された画像が設定される。
また、Vertex よりちゃんと陰が落ちる。
作成されたテクスチャ画像
デフォルト
パラメーター名 | 値 |
---|---|
Destination | 0.5 |
Quality | 0.2 |
Quality の値を下げて、若干陰を濃くしている
パラメーター名 | 値 |
---|---|
Destination | 0.5 |
Quality | 0.1 |
Quality の値を上げて、陰を薄くしている
パラメーター名 | 値 |
---|---|
Destination | 0.5 |
Quality | 0.8 |
Destination の値を上げて 512 から 1024 にしている
パラメーター名 | 値 |
---|---|
Destination | 0.6 |
Quality | 0.2 |
考慮する点
今回、Scene Editor 上でテクスチャの生成を行なったが、3DCG のオーサリングツールがある場合は、そちらで行なった方が処理が速いと思われる。
あと、Model I/O からの生成もできるが事前に生成しておくことをお勧めする。
処理が重く、アプリ実行時には使えないため。
Xcode 9 (iOS 11) での Ambient Occlusion
Xcode 9 の Scene Editor と iOS 11 SDK では Screen Space Ambient Occlusion (SSAO) が導入されたため、リアルタイムで Ambient Occlusion の表現が可能になっている。
多量にジオメトリが配置されていたり、あまり複雑なジオメトリを使用していない場合は SSAO を使用してみるのもの良いかもしれない。
今回はここまで。