読者です 読者をやめる 読者になる 読者になる

しゅみぷろ

プログラミングとか

Unite 2016 Tokyo まとめ(2日目)

Unity

はじめに

Unite2日目で自分が聴講したものについてまとめます。

個人的に興味深かった講演については後日もっと深く掘り下げようと思っています。今回は大雑把にどんなことをお話しされていたか等を残しておきます。

講演の資料はこちらからDLできます。

Unity5を使った「いけにえと雪のセツナ」の雪世界の作り方

雪の世界を表現するためのグラフィックス処理についての講演でした。とにかく素晴らしい講演でした。 参考になる部分が多く、グラフィックス勉強中の身としては大変ありがたいものを聞かせてもらったなぁと。 内容もわかりやすく、Twitterでも評判がかなり良いようでした。

描画設計

マルチプラットフォームなので性能の劣る方を基準に設計したそうです(Vita基準)。 カラースペースはガンマ。Vitaがリニアに対応していなかったためです。 Deferredは処理負荷やVRAMが心配ということでForwardRenderingを採用。 ライティングは基本的にEnlightenを採用。リアルタイムのライトはエフェクトなどの用途でしか使わないようにしたそうです。 Mipmapは基本的にOFF(視点が大幅に変わることが少なく、レベル変動が少ないため)。

シェーダーはUnity5のStanderdを改良していく形で、PassはForwardのみ。 シェーダーはテンプレートを用意してGUIで自動生成する仕組みを作ったそうです。

「カメラでレイヤー分けして任意のRendererを描画する」場合に、レイヤー分けが必要になり、描画以外の目的で使用する場合に扱いづらいので、ReplacedShaderを活用。普通のシェーダーとReplace用のシェーダーを作り、Replace用シェーダーはReplaceしたいシェーダーのSubShaderを全て書いておき、必要な時にカメラで描画する内容をReplaceするようにしたそうです。

Replaceシェーダー(あるいはShaderの基本項目)に関してはこちらで紹介しています。

雪面凹み

歩くと雪面が凹むアレの表現方法です。実装方法は

  • キャラのレンダリングで歩いた(凹ませる)部分を雪面のテスクチャのアルファ値に書き込む(凹みは次第に回復していく)
  • VTF(vertex texture fetch)でテクスチャを参照し、凹ませるべき部分の頂点を弄る

と、おおまかにこんな感じ。PS4の場合はTessellationShaderで雪面のジオメトリを細分化し、よりリアルに雪の凹みを表現しています。

DOF(Depth of Field:被写界深度)パーティクル

降雪を表現するパーティクルで、画面に近い雪がぼやけて見えるのを再現するために作成したもので、単純にtex2Dlodで読み取るMipmapのレベルを逆方向にしただけです。

RendererMerge

シーンの最適化で行った処理で、特定条件下(同一マテリアルを適用できる等)のオブジェクトのMeshを結合してしまうという最適化です。エディタ拡張で特定条件下のMesh群をMesh.CombineMeshesで結合します。

結合後の注意点で、結合後のScene内に埋め込まれたMeshは頂点のRead/Write enabledがtrueになってしまい、設定できないため、Sceneに埋め込まれたMeshを一旦FBXで出力し、出力したFBXを再度prefabとしてインポートし、設定を変更したようです。Mesh.UploadMeshDataがこの目的では利用できないのかな?

頂点ライトマップ

Enlightenを用いてほとんどのライティングを行っているため、かなりの数のライトマップテクスチャを使うため、VRAM の消費も多くなることが問題です。この問題を解決するために生み出されたのが頂点ライトマップだそうです。

頂点ライトマップでは、ライトマップの色を頂点カラーで保持しておくことで、シェーダーからライトマップテクスチャを使わなくてもいいようにする技術です。

頂点のUV座標(MainTextureではなくライトマップ用のUV)から利用するライトマップのカラーを抜き出し、それを頂点カラーに設定するといったようなフローで行われているのかなーと。

映像制作のゲームチェンジャー:メイキング オブ ”THE GIFT”

見応えのある素晴らしい映像作品でしたね!こちらで公開されています。Unityでここまで出来るのかと、正直圧倒されました。

Alembic

Alembicなるデータフォーマットを初めて聞きました。大量の球の描画、どうやってるのかなぁとすごく気になっていたんですが、こんなこともできるんですね。Alembicは時間(インデックス)におけるジオメトリの情報を保持する感じっぽいです。

データ入力・出力

  • Alembic Importer
    • AlembicをUnityで利用するためのツールで、ジオメトリにUnityで作成したMaterialを適用する形でAssetが完成します。
  • Frame Capturer
    • Gameビューの描画内容をキャプチャしてファイル出力します。

によってデータのインポートと絵の出力を行ったようです。

大波エフェクト

波のジオメトリとアニメーションを作成し、AlembicPointCacheなる、おそらくインデックスにおける頂点位置のみを保存したもの(?)を用意し、ポイント情報はテクスチャに格納しておきます。 大量の球はPseudo-Instancing(擬似インスタンシング)で効率的に描画するようにします。

頂点シェーダーでポイント情報のテクスチャから球の位置を決定し、描画させます。

Pseudo-Instancingでメッシュをできるだけ詰め込むために、球は頂点数をできる限り削減したICO球が使われていたように思います。これをそのままレンダリングすると、球は角ばって見えてしまうので、Smoothingなるピクセルシェーダーのトリックで綺麗な球に見せているらしいです。

ビルディング・2Dワールド in Unity ~2D機能のあれやこれや~

新しく追加予定の2D機能のプレビューです。こんなことまで出来るのようになるのかと驚きました。ワクワクします。タイルマップに関しては本当に驚愕で、本当に最高にクールな講演でした。

9スライス

SpriteRendererによるタイリングが強化されました。引き延ばすだけでスプライトがいい感じにタイルするようになったようです。

グリッド機能

Isometricなどの配置にも対応しているタイル配置用グリッドです。Isometricツール等でこういったグリッドが使えますが、それよりもかなり便利そうな印象。。Swizzleによってグリッドの軸方向を変更できるようです。

タイルパレット

タイル配置用のパレットで、ここにタイル用のSpriteを登録し、色味などを変更したりできるようです。このパレットに登録されたタイルをグリッドで分割されたSceneにぽんぽんと配置していく感じでステージなどを構成できます。登録するタイルはスプライトのアニメーションにも対応しています。

プログラマブルタイル

詳細はわかりませんが、タイルにスクリプトを追加できるようです。デモでは、壁や進行方向を自動算出していい感じにタイルを配置するスクリプトを用いていたようです。これはすごく嬉しいですね!

マルチシーン編集の使い方

Unityのシーンおさらい

  • 複数シーンがロード可能
  • ロードされたシーンはメモリ上に展開される
  • Unity5.3まではシーンは1つのみEdit可能

Unity5.3から

  • 複数シーンのEditが可能になった
  • 必要に応じてロード・アンロードが可能に。
  • 実行時にシーンを扱うクラスができた。Applicationクラスを使わない。

メリットとしては

  • シーンを細かい複数の単位として使うことができる
  • ランタイムで複数のシーンを効率的にロード・アンロードする仕組みによっており汎用性あるシーンの構築が可能になる。
  • 複数人のシーン編集によるコンフリクトを避けることができる(デザイナー用・アーティスト用などのようにシーンを分けておくことで回避できる)。

が挙げられます。
Activeなシーンはヒエラルキーに太字で表示されるようになります。

MultiScene実装に伴う拡張

  • Lighting
    • ライトのベイクは複数シーン一斉にできるようになっている。
  • NavMesh
    • 複数のシーンでNavMeshを適用できる。

新しいAPI

SceneManager(Application....にかわるAPI)を利用して必要なタイミングで必要なシーンをロードしたりアンロードしたりすることが可能になりました。たとえば、特定のコンポーネントやゲームオブジェクトを含むシーンがあればそれを全て(あるいは条件を設けて)ロードするなども可能です。

シーンの利用ですが、DontDestroyOnLoadを使うより、あるシーンを作ってその中にマネージャークラス等をぶっ込んで、それをゲーム開始時や必要な時にロードするといった使い方もできます。例外的にこれらのクラスが不要なシーンなどができてもアンロードすることで消し去れます。

CrossSceneReference not support

シーンAのオブジェクトがシーンBのオブジェクトを参照するというのは、Editorではきないけどランタイムではできる(実行時に取得するだけでいい)らしいです。Editor上では静的なデータなので、2つのシーンが同時にロードされているとは限らないためです。

Unityとアセットツールで学ぶ「絵づくり」の基礎(ライト、シェーダー、イメージエフェクト)

とても充実した内容の講演でした。丁度このあたりをサクッと勉強しておきたかった内容なので、個人的に大変ありがたかったです。

絵作りに必要なもの

  • 統一感あるムード
  • 質感

絵画における質感を構成するもの

  • 陰影
  • タッチ

3DCGでは

  • マテリアル(マップ及びシェーダー)
  • ライト(直接光・間接光、ホワイトバランス、ソフトネス、アングル)
  • カメラ(HDR、フォーカス、スクリーンスペースでのイメージエフェクト)

色+陰影+タッチ = マテリアル * ライト * カメラ

ライティングにおけるモチベーションと行為

  • モチベーションは光源のこと
  • 画面外の空間(オフスクリーンスペース)に存在する光源を考慮することが大事
  • 「作為(チーティング)」とは観客におかしいと気付かせない程度に、実際のモチベーションに意図的に細工を加えること

コーネルボックスを通じてGI(グローバルイルミなーション)を知る

tsubakit1.hateblo.jp

コーネルボックスはGI研究のために使われていたもので、もともとはRaytraceの出力と実際の写真を比較するために使われていたそうです。

色は各電磁波がマテリアルに当たりディフーズ反射を行う際に、波長ごとにフィルタリングされます。つまり、光にその波長が含まれなければその色は現れることはないようです(たとえマテリアルがその色を含んでいても)。色は塗るものではなく光によって現れるものであるという感覚が大切です。

光は足し算で混色されるので、補色を合成すると白の光(全ての波長が含まれる光)になります。光の加法混色は補色関係などを考慮するようにします。

各ライトの減衰率にも注意が必要で

  • Directional:減衰なし
  • Point:減衰中
  • Area:減衰大

となっていて、物理法則に最も近いのはAreaライトだそうです。

LightingWindowによるGIの設定

  • General GI:間接光をシーン全体に行き渡らせる
  • PrecomputedRealtimeGI:リアルタイムのライトを事前計算によりどの程度GIが影響を与えるかを調べ、ライトマップに追加される
  • Baked GI:ベイク用のライトのライトマップの精度を設定する
  • EnvironmentLighting:アンビエント光の設定ができる。光源として利用できるのはスカイボックス、IBL、カラー及びグラディエント

間接光の影響を動的オブジェクトに反映させるには

* LightProbeを配置する
* 動的オブジェクトのマテリアルに作為を加える
* フェイクライトを置いてBloomを追加する
* SSAO(Screen Space Ambient Occlusion)を追加する

といったことが必要になります。

Tips

Baked GI

  • メモリに依存
  • モバイルによく利用される
  • ForwardRenderingの場合に使う

Precomputed Realtime GI

  • CPUパワーに依存
  • デスクトップ・コンソール向き
  • リアライトが使用できない

物理ベースシェーダー(PBS)

物理的に正しいシェーダーのことです(入射光以上の明るさを物体が反射することはありえない、エネルギー保存則が破綻しない)。

光の反射は

  • ディフーズ反射
    • 光が全ての方向に均一に散乱
  • グロッシィ反射
    • 光線の方向性を維持しつつ、ある程度散乱したり和らいだりする
  • スペキュラ反射
    • 光のシャープさが維持され、全ての光線が散乱せずに反射する

で表現されます。