Apple Engine

Apple, iPhone, iOS, その周辺のことについて

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 の項目がある。

f:id:x67x6fx74x6f:20170813192429p:plain

 

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 を白にする。

f:id:x67x6fx74x6f:20170813192602p:plain

 

まず Vertex を試してみる

初期値は Vertex のままなので、Attributes Inspector の下の Bake ボタンを押す。

陰が描画されるとわかる。

f:id:x67x6fx74x6f:20170813192812p:plain

 

Color が追加され、Inspector の目のアイコンから状態を確認すると、頂点に色が追加されているのがわかる。

f:id:x67x6fx74x6f:20170813193036p:plain

 

Diffuse で元のテクスチャを適応するうっすら陰がポリゴンの継ぎ目に落ちている。

f:id:x67x6fx74x6f:20170813193152p:plain

 

Texture を作成する

Destination で Texture に変更し Bake ボタンを押す。

f:id:x67x6fx74x6f:20170813193318p:plain

 

テクスチャ画像作成後、自動的に Texture coordinates による UV 情報が付加され、マテリアルの Occlusion に作成された画像が設定される。

また、Vertex よりちゃんと陰が落ちる。

 

作成されたテクスチャ画像

デフォルト

f:id:x67x6fx74x6f:20170813194754p:plain

パラメーター名
Destination 0.5
Quality 0.2

 

Quality の値を下げて、若干陰を濃くしている

f:id:x67x6fx74x6f:20170813194807p:plain

パラメーター名
Destination 0.5
Quality 0.1

 

Quality の値を上げて、陰を薄くしている

f:id:x67x6fx74x6f:20170813193940p:plain

パラメーター名
Destination 0.5
Quality 0.8

 

Destination の値を上げて 512 から 1024 にしている 

f:id:x67x6fx74x6f:20170813194315p:plain

パラメーター名
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 を使用してみるのもの良いかもしれない。

 

今回はここまで。