20.6K Views
November 14, 24
スライド概要
本講演へのアンケートにご協力をお願いします:
https://docs.google.com/forms/d/e/1FAIpQLSeeq3O53ausrSoHXHluKskiabOlucYgXBajAhVQ2IbL__Km7Q/viewform
Youtube URL:https://youtu.be/p8itQHGyx0c
講演内容:
『TEKKEN8』にて、派手な演出を60fpsで実現するために行った工夫を紹介します。
負荷を抑えたライティングやギミック、そしてアートが不自由なく調整できる環境について説明します。
講演者:
山本 治由(エンジニア(株式会社バンダイナムコスタジオ))
バンダイナムコスタジオについてはこちら:
https://www.bandainamcostudios.com/
UNREAL FEST 2024 TOKYO 公式サイト:
https://unrealengine.jp/unrealfest/2024/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
『TEKKEN8』における 演出ライトシステムと負荷対策 株式会社バンダイナムコスタジオ 山本治由 TEKKEN 8 & ©Bandai Namco Entertainment Inc.
自己紹介 山本治由 2006年 株式会社バンダイナムコゲームス入社 (現バンダイナムコスタジオ) • 鉄拳6~鉄拳Tag2 / 背景、エフェクトツール • サマーレッスン • エースコンバット7(VR) • TEKKEN8 • アートの ライトのサポート • 演出機能
鉄拳8 • 発売日 2024年1月26日 • 対応プラットフォーム PS5、Xbox Series X|S、PC(Steam) • 製品で利用したバージョン UE5.2 ※ 参考 PCスペック ・解像度:フルHD (1920×1080) ・FPS (フレームレート/秒):60以上で安定 ・解像度:4K (3840×2160) ・FPS (フレームレート/秒):60以上で安定 最低 推奨 最低 推奨 プロセッサー •Intel Core i5-6600K •AMD Ryzen 5 1600 •Intel Core i7-7700K •AMD Ryzen 5 2600 •Intel Core i5-6600K •AMD Ryzen 5 1600 •Intel Core i7-7700K •AMD Ryzen 5 2600 グラフィック •Nvidia GeForce GTX 1050Ti •AMD Radeon R9 380X •Nvidia GeForce RTX 2070 •AMD Radeon RX 5700 XT •Nvidia GeForce GTX 980 •AMD Radeon RX 6500 XT •Nvidia GeForce RTX 2080Ti •AMD Radeon RX 6700 XT
鉄拳8の演出 • 演出には ライトが重要! • エンジニアとして • アート班が作業しやすい環境を作る • ゲームの状況に応じた、自動化したシステムを作る といった内容を紹介します
鉄拳8のライトに求められるもの • アート視点 背景やキャラクターを恰好よく、魅力的にみせる! • ゲームデザイン視点 格闘ゲームとしてキャラクターの動きを確認しやすくする!
鉄拳8のライトに求められるもの • アート視点 背景やキャラクターを恰好よく、魅力的にみせる! • ゲームデザイン視点 格闘ゲームとしてキャラクターの動きを確認しやすくする! ただし、負荷は60fps(16.6ms)以内に収める
鉄拳8のレギュレーション • GPU負荷レギュレーション 対象シーン 負荷(ms) シンプル背景+キャラクター表示 8 背景表示 10 • キャラクター、背景 両方表示すると、12msくらい • 16.6ms を越えない範囲で 演出にこだわる ※ PlayStation5、解像度4K、内部解像度60%で計測
鉄拳8のレギュレーション 処理時間(ms) 16.6 演出で使えるぶん 12 ゲームで最低限必要 0
ゲームシーケンス 登場 バトル中 レイジアーツ予告 レイジアーツ中
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
背景ライト
鉄拳8の背景ライト • 現実のライトに近い環境で作りたい! • 色んなモデルを 破綻なく表示できるようにしたい! • エンジニア:ただし極力負荷は下げたい!
鉄拳8の背景ライト • Epic公式のSunSkyをベースに利用 • 現実世界に合わせたパラメータで調整できる • ただ、極端に数値が大きく/小さくなり、扱いにくい場面がある • ライトベイクを利用 • 負荷とクオリティのバランスを考慮
鉄拳8の背景ライト モデル確認環境 現実のライトに近い環境
鉄拳8の背景ライト • シーンごとのEV(ExposureValue)
SunSky準備 (1/3) サムネイルの調整 • Emissiveマテリアルのサムネイルが白飛びしてしまう 標準のサムネイル Emissive補正したサムネイル
SunSky準備 (1/3) サムネイルの調整 • Emissiveマテリアルのサムネイルが白飛びしてしまう • 画角が30、Viewサイズが正方形、Exposureが1 の時はサムネイル表示と判定 • Emissiveを自身のRGB値の最大値で割る 標準のサムネイル Emissive補正したサムネイル
SunSky準備 (2/3) DebugViewの調整 • DebugView(Unlit表示)が白飛びしてしまう 標準のUnlitView Emissive補正したUnlitView
SunSky準備 (2/3) DebugViewの調整 • DebugView(Unlit表示)が白飛びしてしまう • View.UnlitViewmodeMaskで判定 • Emissiveを自身のRGB値の最大値で割る 標準のUnlitView Emissive補正したUnlitView
SunSky準備 (3/3) Previewの設定追加 • メッシュやマテリアルプレビューが白飛びしてしまう
SunSky準備 (3/3) Previewの設定追加 • メッシュやマテリアルプレビューが白飛びしてしまう • PreviewSceneSettingを追加。SkyLightを強くしたシーンに切り替える
SunSky準備完了
鉄拳8の背景ライトのベイク • 切り替えるサブレベルをリスト管理
鉄拳8の背景切り替え例 (1/2) • ラウンドを跨ぐ時に、昼夜が切り替わる
鉄拳8の背景切り替え例 (2/2) • 演出中に背景ごと切り替わる
鉄拳8の背景ライト まとめ • 良かった点 • ベースの明るさについて、SunSkyにお任せできた • 色んなライト環境でアセットを確認しつつ、背景を作成することができた • ベイクを利用することで、クオリティを担保しつつ負荷を下げることがで きた • 微妙だった点 • 鉄拳8のライトの切り替わりは一瞬かつ ライトベイク前提なので、 SunSkyを効果的に使える場面が少なかった • 室内や特殊背景のライトは手動で設定する必要がある
鉄拳8のライト • 背景ライト • キャラクタライト • バトル キャラクタライト • 登場・勝利演出ライト • 演出ライト • メニュー用 キャラクタライト
キャラクタのライト
鉄拳8のキャラクタライト • キャラクタを格好よく見せたい! • ゲームプレイに支障が出ないよう、明るくしたい! • エンジニア:ただし極力負荷は下げたい!
バトル中のキャラクタライト • 背景ライトのみ
バトル中のキャラクタライト • 背景ライト+キャラクタライト
ライトの基本 • キーライト • 一番明るい メインとなるライト • フィルライト • 影を目立たなくするため • バックライト • 輪郭をはっきりさせるため
キーライト バックライト1 バックライト2 フィルライト
バトル中のキャラクタライト • 背景のDirectionalライト + キャラ用 SpotLightx3 • キャラ用ライトは 全てCastShadow OFF • 負荷を抑えるため 背景ライト(キーライト)のみ 背景 + キャラクタライト
バトル中のキャラクタライト • ライトチャンネルを利用し、キャラのみ当てる • 順光、逆光のパラメータを設定できる カメラ位置に応じて補間される 順光 フィルライト弱め 逆光 フィルライト強め
ライト追従:カメラ位置取得
• ゲーム中/エディタ操作中 それぞれでカメラ位置を参照できる
// ゲーム中のカメラ位置
auto* camera = UGameplayStatics::GetPlayerCameraManager(WorldContextObject, PlayerIndex);
camera->GetCameraLocation();
camera->GetCameraRotation().Quaternion();
// エディタ操作中のカメラ位置
if (GEditor->bIsSimulatingInEditor) {
if (GEditor->GetActiveViewport()) {
FEditorViewportClient* ViewportClient
= StaticCast<FEditorViewportClient*>(GEditor->GetActiveViewport()->GetClient());
}
}
ViewportClient->GetViewLocation();
ViewportClient->GetViewRotation().Quaternion();
ライト追従:更新タイミング • Play中はTickで処理 • エディタ操作中は カメラが移動した時のみ処理する FEditorDelegates::OnEditorCameraMoved.AddUObject(this,&UMyCameraDispatcherComponent::OnCameraTransformC hanged); void UMyCameraDispatcherComponent::OnCameraTransformChanged(const FVector&, const FRotator&, ELevelViewportType, int32) { // カメラが動いた時の処理や通知 OnCameraMove.Broadcast(); }
鉄拳8のキャラクタライト まとめ • 良かった点 • 少しのパラメータ調整で、色んな状況に対応できた • 見栄えを担保しつつ、負荷も抑えることができた • 今後改善したい点 • 背景ライト変更のたびに、キャラクタライトの再調整が入ってしまった
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
登場・勝利演出ライト
登場・勝利演出ライト • キャラクタの登場シーンを照らすライト
登場・勝利演出ライト • キャラクタの登場シーンを照らすライト
登場・勝利演出ライト • ライト3個 • カメラ追従のON/OFF 設定変更 • ライトパラメータ設定変更(影やスペキュラ成分など)
キーライト バックライトor キーライト バックライト フィルライト
登場・勝利演出ライト • ContactShadowあり
登場・勝利演出ライト • ContactShadowなし
登場・勝利演出ライト • 演出の再生位置、ライトの種類 などをエクセルで管理 • 数が膨大なため(キャラ数 x 演出数 x ステージ数)
登場・勝利演出ライト • バイナリコンバートでエディタに反映する バイナリコンバート エクセルで整理 確認&調整 調整パラメータをコピー&ペースト
登場・勝利演出ライト • エディタからパラメータをクリップボードにコピーできる 調整パラメータをコピー&ペースト
登場・勝利演出ライト 特殊処理 • 演出ライトをそのまま当てると、白飛びしてしまう • 効果的に当てるには、既存のライトを弱める必要がある
登場・勝利演出ライト 特殊処理 • 既存のライトの影響を減らしてから 演出ライトをのせる 背景ライトのみ キーライトOFF 環境光、リフレクション弱める
登場・勝利演出ライト 特殊処理 • DirectionalLight または ライトチャンネル1,2がONのライトのみ、 明るさを調整できる • 室内のキーライトは ライトチャンネル1,2をONにしておく DeferredLightPixelMain() 内 // custom begin #if USE_LIGHTING_CHANNELS if ((GetLightingChannelMask(InputParams.ScreenUV) & 2) #if (LIGHT_SOURCE_SHAPE != 0) && ((DeferredLightUniforms.LightingChannelMask & 3) == 3) #endif ){ LightData.Color *= View.MyCharacterLightMainColorScale.xyz; } #endif // custom end
登場・勝利演出ライト まとめ • 良かった点 • 背景ライトを下げることで、演出ライトを効果的に利用できた • 負荷の許す限りの、豪華な設定ができた • 大量のシーンを設定・管理できた • 反省点 • エクセルが巨大になりすぎた
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
レイジアーツ演出ライト
レイジアーツ予告
レイジアーツ予告 (1/2) • SpotLight3個 • うち2個は影あり
キーライト バックライト1 バックライト2 フィルライト
レイジアーツ予告 (2/2) • 背景の色味やエフェクトについて シーケンサーで制御
レイジアーツ中 • エフェクトとポイントライトを追加 • ポイントライトはキャラクタに影響しないよう配置
キーライト バックライト1 バックライト2 フィルライト
レイジアーツ中(特殊な例) • 演出専用背景に遷移する • アートチーム側で ライト・エフェクトなど自由に設定可
背景 補正処理 • 彩度やラフネスなど調整できる
キャラ 補正処理 • 彩度やラフネスなど調整できる
ステンシルマスクの利用について • キャラクタを判別してポストフィルタ処理できる … が、利用箇所を制限している • 歪みエフェクトのマスクがずれてしまう • 半透明エフェクトが影響を受けてしまう • エッジがジラついてしまう
余談:ステンシルマスクの利用 • アクセシビリティ、カラーサポート機能で利用
エフェクト補正処理 • 背景(ライト)が異なると、見え方が変わってしまう 正しく見えていても… 明るい場所で 見栄えがかわってしまう
エフェクト補正処理 • 背景によって見え方が変わってしまう • ライトとマテリアルを 現在のEVで補正する 補正前 明るさ補正後
エフェクト補正処理 • ライトの補正 • NiagaraLightRendererにて、ライトを一括スケールできる • マテリアルの補正 • Emissiveについて、一括スケールできる
エフェクト補正処理 • 同じ明るさで描画できる!
バトルシーケンスとライトの設定 登場 バトル中 レイジアーツ予告 レイジアーツ中 シャドウ 〇 × 〇 × コンタクトシャドウ 〇 × × × エフェクトライト 〇 〇 × 〇 レンズフレア用ライト × × × 〇 キャラクタライト設定 追加ライト
レイジアーツ演出ライト ポストプロセスフィルタ
ポストフィルタによる演出 • バトルの進行によって イベントが通知される • 演出管理Actorで受け取り シーケンサー再生や 別の管理Actorを生成する Battle用 EventDispatcher 登場演出開始 レイジアーツ発動 演出背景切り替え 相打ち発生 リザルト表示開始 : イベント通知 演出管理Actor シーケンサー再生 演出Actorの生成 演出管理Actor 演出管理Actor :
演出管理Actorによる制御 • シーケンサーで演出ActorやPostProcessを制御
演出管理Actorによる制御 • シーケンサーで演出ActorやPostProcessを制御
演出管理Actorによる制御 • 演出用マップに切りかえる • 演出効果はレベル配置のPostProcessVolumeに仕込まれている
演出管理Actorによる制御 • 演出用マップに切りかえる
演出管理Actorによる制御 • 画面キャプチャ、合成&アニメーション
鉄拳8のライト • 背景ライト
鉄拳8のライト • 背景ライト バトル中ライト+ブラー 勝利演出ライト+ステンシルマスク レイジアーツライト+反転 演出用ライト&マップ
バトル中演出ライト まとめ • 複数のステージや演出について、 共通のライトのシステムを利用できた • アートが自由にライトに拘れる環境を用意できた
負荷対策
自動 キャラ、背景負荷チェック • 指定したシーンを描画し、負荷を記録する • 日ごとの負荷の履歴が確認できる
自動 ヒッチチェック • 自動的に対戦を繰り返し、瞬間的に負荷があがるシーンを記録する • DumpHitch関数内で、EventDispatcherで通知する • 負荷グラフ(stat raw)付きのスクショを保存 t.HitchFrameTimeThreshold 20 Stat DUMPHITCHES -start
動的解像度の動作変更 • 標準のままでは なかなか解像度が下がらないシーンがあった • CPU落ちしたフレームでは 解像度が下がらない GPU落ちしてから解像度が変わるまで 数フレームかかる • とにかく最速で解像度を下げる! ように変更 r.DynamicRes.FrameWeightExponent とかを参照 • 強制的に低解像度に設定できる機能を追加 • レイジアーツ開始フレームは 低解像度からスタート • 負荷に余裕があれば 解像度は上がっていく ※家庭用ゲーム機のみ
Map毎に開いた時にパラメータ適用 • エディタでマップを変えた時にパラメータを適用する 撮影用マップ r.Shadow.Virtual.Enable 1 r.VolumetricFog.GridSizeZ 128 r.VolumetricFog.GridPixelSize 8 r.ShadowQuality 5 バトル用マップ r.Shadow.Virtual.Enable 0 r.VolumetricFog.GridSizeZ 24 r.VolumetricFog.GridPixelSize 8 r.ShadowQuality 4
Map毎に開いた時にパラメータ適用
• エディタでマップを変えた時にパラメータを適用する
• マップ毎にパラメータを変更可能。マップ切り替え時に確実に元に戻せる。
• VolumetricFogの品質を上げる/下げる
• VirtualShadowをON/OFF
• LODを強制ON/OFF
static const FName LevelEditorName("LevelEditor");
FLevelEditorModule* LevelEditorModule =
FModuleManager::GetModulePtr<FLevelEditorModule>(LevelEditorName))
LevelEditorModule->OnMapChanged().AddUObject(this, &AMyMapOpenScriptActor::OnMapChanged);
エディタ用 キャラ選択UI • キャラ&コスチューム切り替え機能 • キャラセレUIの素材を使って、一覧表示している • PlayIn中にも設定変更、適用できる
エディタ用 背景選択UI • 背景を切り替えを行う機能 • umapのサムネイルを利用して一覧表示している • ライトの変更や、描画設定の切り替えもできる
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
メニューの演出ライト
メインメニュー用ライト • ポイントライト2個 • シャドウマップ解像度を上げている
鉄拳8のレギュレーション 処理時間(ms) 16.6 演出で使えるぶん 12 演出で使えるぶん ゲームで最低限必要 0 バトル中 メニュー表示中
メインメニュー用ライト • ポイントライト2個 • シャドウマップ解像度を上げている
メインメニュー演出 • 複数のシーケンサーを同時再生している • ライトは独自にフェードし、2つだけ有効化される • FogやBloomなども個別に設定されている
メニューライト まとめ • アートが拘れる専用のシーンを用意することで、 高級感のある絵を出すことができた
キーライト バックライト1 バックライト2 フィルライト
鉄拳8のライト • 背景ライト • キャラクタライト • 登場・勝利演出ライト • バトル キャラクタライト • 演出ライト • メニュー用 キャラクタライト
まとめ • 場面ごとに仕組みを用意することで、 設定の手間を抑えつつ 柔軟な演出を設定することができた • ゲーム/エディタ どちらの環境も整備することで、 アート班が効率よく開発を進めることができた • レギュレーションと負荷チェックの仕組みによって、 GPUリソースを効率よく利用できた
鉄拳8の演出 • 演出には ライトが重要! • エンジニアとして • アート班が作業しやすい環境を作る • ゲームの状況に応じた、自動化したシステムを作る
鉄拳8の演出 • 演出には ライトが重要! • エンジニアとして • アート班が作業しやすい環境を作る • ゲームの状況に応じた、自動化したシステムを作る ライトを自在に操って魅力的な演出を作り上げよう
ご清聴ありがとうございました
アンケートへのご協力をよろしくお願いします <アンケートURL>