Share
Embed
Transcript
79 slides
-
3/79 ⾃⼰紹介 • ⾦井 ⼤ • Cygames Research/シニアゲームエン ジニア •
ゲーム開発を軸にVR、ゲームエンジン、 グラフィックスなど、幅広い分野の研究 開発に従事。 • 本件で紹介する⼤型アップデート施策で は、3Dグラフィックス関連のマネジメン トとアーキテクト、実装を担当 -
6/79 弊社での適応事例の紹介 • 2015年にリリースのゲームコンテンツ • Unityで60fpsを担保しつつ3Dグラフィックス表現しているのが ⼤きな特徴。キャラクター種類数は200体以上 • 2017年6⽉に⼤型アップデートを適応。運営チームとは別に アップデートチームを結成し、三か⽉で開発を⾏う
2015年 アプリのリリース 2017年 ⼤型アップデート アップデートチームにて 三か⽉間で開発 -
7/79 Speaker Deckに資料があります • Unite2016で講演した内容とほぼ重複する内容です • Unity 3D 考え⽅ でググると出てきます
https://speakerdeck.com/cygames/unity-sumahode3dgemukai-fa-zui-shi-hua-surutamefalsekao-efang -
9/79 ⼤型アップデートで⾏われた事 • グラフィックスの⾼品質版を追加 • 2D版と3D版を含め、ゲーム中の品質設定の選択肢が6段階に 3D ⾼品質(アップデートで追加) 3D 標準
3D 軽量 2D ⾼品質(アップデートで追加) 2D 標準 2D 軽量 -
10/79 ⼤型アップデートによる品質選択の変化 • 従来は標準版が最⾼スペックであったが、アップデートにより ミドルレンジに降格 ⾼品質版 標準版 軽量版 ハイエンド端末でのみ体験できる ⾼品質な画⾯を提供
ミドルレンジ端末で⾼品質な画⾯を提供、 60fpsをキープ 幅広い動作保証のため限界まで スペックを落としつつ60fpsをキープ -
12/79 3Dグラフィックスの⾼品質化で⾏ったこと • イメージエフェクトのクオリティアップ • プロジェクションシャドウ • ミラー • ライトシャフト、その他多数
• キャラクターのクオリティアップ • シェーダーの拡張(リム、スペキュラ、環境マップ • キャラのスペック向上(1500tri程度) • キャラの法線データを⼆重化 • 専⽤アセットバンドルの構築 • 画⾯解像度 • フレームバッファの⾼解像度切り替え • MSAAの導⼊ • ETC2フォーマットの導⼊ • OpenGLES 3.0への対応 • Unityのバージョンアップ -
16/79 標準版のパイプライン • 標準版ではBloomとDOF(被写界深度)が動作、ForwardBaseに 加えてShadowCasterによるUpdateDepthTexture処理と、 ImageEffect処理が追加される • UpdateDepthTextureにより描画頂点数は2倍弱に増える 16 Camera
UpdateDepthTexture ForwardBase ImageEffect -
17/79 ⾼品質版のパイプライン • プロジェクションシャドウ、ミラー処理等でカメラが増え、対 となるForwardBaseとImageEffectが追加される Camera UpdateDepthTexture ForwardBase ImageEffect Camera
(Mirror) ForwardBase ImageEffect Camera (ProjectionShadow) ForwardBase ImageEffect -
18/79 プロジェクションシャドウ • Unity標準のソフトシャドウはモバイルで利⽤できないため、 ⾃前で実装する • ライトスペースのカメラを⽤意してシャドウマップをレンダリ ング、特定のモデルに対してプロジェクションする • 描画パスが増えるので、影を落とすモデルをLayerで管理する
ハードシャドウは ジャギーが⽬⽴つ ソフトシャドウにより 柔らかい光源を表現 -
19/79 • ミラー⽤カメラを⽤意して鏡⾯レンダリング、特定のモデルに 対してプロジェクションし、地⾯への映り込みをリアルタイム 処理する • UnityのReplaced Shadersを利⽤して、ミラーパスでの描画に 利⽤するシェーダーの品質を制御する ミラー
Tags { “Mirror"=“Chara" } Character.shader (Mirrorタグを持たない) Object.shader Tags { “Mirror"=“Chara" } Mirrored.shader Replace Camera.SetReplacementShader( Mirrored, ”Mirror” ) -
21/79 レンズフレア • Unity標準のレンズフレアにて対応。コリジョン機能が必要とな るため⾃前で実装するのは⾮現実的 • 光源が隠れた際にフレアが正しく消えないと不⾃然に⾒える。 コライダーの設定にはアセット作成の⼯数が発⽣するため、作 業⼯数が課題となる •
キャラクターは⼈型しかないので、ひな型を作って量産化、問 題があるデータを順次修正して対応 Unity標準機能でも ⼀定品質を担保可能 -
23/79 まとめ • イメージエフェクトは⼤型アップデートに含むか採択しやすい。 処理負荷にのみに着⽬することができる • 基本の頂点スペックには配慮が必要。追加するイメージエフェ クトによって描画パスの数が変動するため • 全てを⾃作する必要はない。Unity機能をそのまま利⽤したり、
Unity機能をベースとすることで開発期間を短縮し、空いた時間 を他の要素のクオリティアップに回す -
25/79 ライティングアルゴリズム変更の課題 • 前提として、シェーダーは全て⾃社で作成している。標準版ま では軽量化のためライティングを⾏っておらず、diffuseテクス チャに陰影を描き込んでいた • ライティングを強化し、キャラクターの動きに応じた陰影の変 化や、スペキュラーやリム、環境マップなどの表現を⼊れたい •
しかしながら、テクスチャやシェーダーを変更せず表現をリッ チにするのは限界がある -
27/79 ライティングアルゴリズムの変更 • 検証の結果、キャラクターに以下を導⼊する • リム • 環境マップ • スペキュラー
• 以下は検証を⾏ったが、対応を⾒送る • ノーマルマップ • トゥーンレンダリング https://docs.unity3d.com/ja/current/Manual/StandardShaderMaterialParameterSpecular.html -
28/79 ライティングアルゴリズムの変更 • リム、スペキュラ、環境マップの対応は、キャラクターや カメラ移動に応じた変化により⾮常に効果が⾼い。 diffuseテクスチャに描き込んだ陰影の修正も最低限となりそう • ノーマルマップはデータ作成にあたりUVの⼤幅な修正が必要と なり、フラグメント負荷も予想しずらいため、対応を⾒送り •
トゥーンレンダリングについてはテクスチャ陰影とのバッティ ングする要素が多く対応を⾒送り -
29/79 • リム、環境マップ、スペキュラーの強度を制御するための パラメーターテクスチャを導⼊。専⽤のテクスチャを⽤意し、 RGBチャンネルで強度を制御する 制御マップの導⼊ 制御マップ R G B
特定箇所のみ環境マップを有効化するといった⽤途には 頂点単位の制御では不⼗分であり、制御マップが必須となる -
30/79 正しいライティングを⾏うための課題 • 正しい法線情報を保持する必要がある。 • 標準版まではライティングしておらず法線情報を持っていない。 正確には、アウトライン⽤に調整された法線を保持している • リムや環境マップ計算には、正しい法線情報が必要となるが、 Unityのメッシュデータは2つ以上の法線情報を保持できないた
め、ライティング時に問題となる アウトライン幅等の調整をメッシュの法線で ⾏っているため、正しい法線情報が⽋落している -
31/79 正しいライティングを⾏うための課題 • Unityはスキニング結果が頂点シェーダーに渡ってくるため、 UV2に法線を⼊れてもスキニングされた法線を算出できない • tangentに法線を持たせればスキニングの問題は解決するが、 法線を埋め込む⽅法が⾒当たらない。MayaからのFBX出⼒時に tangentへアクセスできない Vertex
Normal Tangent UV0 頂点シェーダー スキニング される スキニング されない -
32/79 • AssetImport時に処理すれば解決できる • UV2とUV3に法線情報を⼊れたFBXを別途⽤意し、UnityのFBX インポート時にUV2とUV3をtangentへ移動させる 対になる2つのFBXを AssetImport時に処理し、 tangentに法線を⼊れる 2つの法線情報を保持させる⽅法
従来のFBX 正しいNormalを 保持したFBX スキニング処理された 2つの法線を持つ Meshとなる -
33/79 オーサリングの課題と解決 • 今まではMaya上の⾒た⽬がUnityと概ね⼀致していたが、 ライティングアルゴリズム変更により⼀致しなくなった。 • リムやスペキュラ、環境マップをUnityでしか確認できないのは アーティストからすると⾮効率。200体以上のデータ確認と今後 のデータ作成を踏まえた対策が必要 •
Mayaでプレビューできるのが直観的。CGFXでも動作するよう シェーダーを組み直し、イテレーション速度と品質を担保する -
34/79 まとめ • ライティングアルゴリズムの変更は、影響範囲について最⼤の 配慮が必要。既存アセットの修正数によってはアルゴリズムの 変更が困難となるため、そもそも適応できない可能性があった • 導⼊したアルゴリズムは⾮常に効果的であった。キャラクター やカメラの移動に応じた陰影の変化は視覚的に重要 •
アーティストへの配慮が必要。ワークフローが変化しDCCツー ル上でのプレビューの優先度が上がる -
36/79 フレームバッファの⾼解像度化とMSAA • ⾼品質版では解像度が選択可能となった。従来の標準版はジャ ギーが⽬⽴っており、特にiPhone6Plusなど横1920以上の端末 では顕著になっていた • 標準解像度ではMSAAx4を適応 • ⾼解像度ではドットバイドットになるよう配慮。将来的な端末
の⾼解像度化を考慮して、iPad Pro想定の上限値を設定している 解像度 MSAA 標準設定 横1280で固定 MSAAx4 ⾼解像度設定 横2732が上限 無効 -
43/79 バンディングの現実的な解決⼿法 • ETC2は圧縮時間と品質をバランスよく担保することができる • ETCでも圧縮品質をBestにすることによりバンディングをある 程度除去できるが、圧縮時間に40秒かかり現実的ではない。対 象のテクスチャは1000枚以上存在するため、開発の速度に⼤き なインパクトを与える ETCフォーマット
ETC2フォーマット 圧縮品質 Normal Best Normal Best バンディング × 〇 〇 〇 圧縮時間 約0.5秒 約40秒 約0.5秒 約70秒 -
44/79 なぜETC2を使っていなかった? • OpenGLES 2.0ではETC2は拡張扱いであり、未サポート端末 ではメモリ使⽤量が6倍となり、アプリ⾃体が動作しなくなる リスクが⾼い(テクスチャがフルカラー展開されるため) • Unityのテクスチャは1プラットフォーム中で複数フォーマット を保持することができないため、テクスチャ⾃体をETC/ETC2⽤
に複数保持しておく必要がある • UnityにはETC2サポートを問い合わせるインターフェースが存 在するが、Unity5.1.2ではバグにより正しく判定されないため、 例外対応を⾏うことができない -
51/79 今回の⼤型アップデートでは • 今回の⼤型アップデートでは、Unityバージョンを5.1.2から 5.4.5へバージョンアップした • 以前よりUnityのバージョンアップが可能か検討を⾏っていたが、 バージョンアップ検証と安定運営との両⽴が難しく、先送りと なっていた •
⼤型アップデートによるグラフィックスの品質向上に伴い、 ETC2フォーマットの採⽤が必要となったため、Unityバージョ ンを上げることになった -
53/79 今回のバージョンアップの前提 • このプロジェクトでは、リリースしてからの2年間、Unityバー ジョンを上げたことがない • 運営に⼊ったプロジェクトでのUnityバージョンアップのポリ シーは概ね2つのケースに分かれる • 基本は安定版を利⽤、バージョンアップやパッチ適応は最低限とする
• 可能な限り最新バージョンに追従する • 安定版を利⽤すると機能追加に制限が⼊り、バグ対応が困難な ケースがある。最新バージョンへの追従は、特にメジャーバー ジョンの変更時にインパクトが⼤きい • 今回のプロジェクトでは前者のケース -
54/79 Unityアップデートをどのように進めるか? • プロジェクトには多数の運営スタッフが関わっており、安易な バージョンアップは危険。同プロジェクト内で新旧のリソース が混在してしまう、などの混乱が予想される • どのバージョンに、チーム内のどの順番であげ、どのように混 乱を避けるか、と計画性をもって取り組む必要がある •
アップデートチームがまずバージョン選定を⾏う。本来であれ ば可能な限り複数バージョンを検証したいが、社内での運⽤実 績が多く、更にある程度検証済みの5.4.5p1を候補とする -
58/79 AssetBundleの互換性を保つ • 本プロジェクトではAssetBundleが意図しないシェーダーを含 むケースがあり、5.1.2でビルドしたAssetBundleが5.4.5では 利⽤できなくなっていた • シェーダーに互換性がないのが原因。uniform名が変更されてい るため、5.1.2のシェーダーは5.4.5ではコンパイルエラーにな る
• 互換性がないAssetBundleは、シェーダーを分離させて互換性 を持つように対応をした -
62/79 ⼤型アップデート成功のための考え⽅ • ⼤型アップデートは機能を開発して終了ではなく、開発したも のが運営に対してどういう影響を与えるか、ということまで考 える必要がある • 今回の⼤型アップデートで増えたリソースの数は約7000件、増 えたAssetBundleの数は約2150件あるため、運営側への影響は ⾮常に⼤きい
• ほんの少しの懸念でも、運営に⼊っては取り返しのつかないこ とになる可能性があるので、開発の段階で全て潰す -
68/79 どういうことなのか? • アセットインポート時にアセット操作を⾏う場合に意図しない 動作となるケースがあり、それを指している? • アセットインポーターを変更しても、csのコンパイルが⾛るだ けで、キャッシュ上のアセットは変更されない。アセットイン ポーターの変更が反映されていないアセットがキャッシュされ ているため、それが落ちてきてしまう
• マテリアル固有の問題ではなさそう。再インポートを明⽰的に ⾏いキャッシュを更新することで解決が確認できた -
71/79 まとめ • 運営中のプロジェクトで⼤型のアップデートを成功させるため には、どう進めれば安定した運営を提供し続けられるのか、と いうことを念頭において開発を進めていく必要がある • 運営中のプロジェクトでは機能を開発して終了ではなく、開発 したものが運営に対してどういう影響を与えるか、ということ まで考える必要がある
• ほんの少しの懸念でも、運営に⼊っては取り返しのつかないこ とになる可能性があるので、開発の段階で全て潰す -
73/79 イメージエフェクトのクオリティアップ • イメージエフェクトは⼤型アップデートに含むか採択しやすい。 処理負荷にのみに着⽬することができる • 基本の頂点スペックには配慮が必要。追加するイメージエフェ クトによって描画パスの数が変動するため • 全てを⾃作する必要はない。Unity機能をそのまま利⽤したり、
Unity機能をベースとすることで開発期間を短縮し、空いた時間 を他の要素のクオリティアップに回す -
74/79 キャラクターのクオリティアップ • ライティングアルゴリズムの変更は、影響範囲について最⼤の 配慮が必要。既存アセットの修正数によってはアルゴリズムの 変更が困難となるため、そもそも適応できない可能性があった • 導⼊したアルゴリズムは⾮常に効果的であった。キャラクター やカメラの移動に応じた陰影の変化は視覚的に重要 •
アーティストへの配慮が必要。ワークフローが変化しDCCツー ル上でのプレビューの優先度が上がる -
77/79 Unityと⼤型アップデート • 運営中のプロジェクトで⼤型のアップデートを成功させるため には、どう進めれば安定した運営を提供し続けられるのか、と いうことを念頭において開発を進めていく必要がある • 運営中のプロジェクトでは機能を開発して終了ではなく、開発 したものが運営に対してどういう影響を与えるか、ということ まで考える必要がある
• ほんの少しの懸念でも、運営に⼊っては取り返しのつかないこ とになる可能性があるので、開発の段階で全て潰す -
78/79 まとめ • ⼤型アップデートは⾮常に反響が⼤きく、やったかいがあった。 運営を⾒越し⼊念な計画を⽴て、アーティストの作業コストも 配慮してアップデート内容を決定したのが功を奏した • ライティングアルゴリズムの変更は痛みを伴った。元データの 構成によってはアセット修正が必要となるため、リリース前に 可能な限り考慮を⾏うべき
• リリースから2年経過したが端末の性能向上がすさまじい。今 後は動作スペックの選択肢をユーザーに提供することが必須に なると予想する