🚰

Redshiftライトベイクワークフロー

に公開

こんにちは、テクニカルアーティストの与羽です。今回はRedshiftを使った効率的なライトベイクのワークフローについて解説していきます。

image.png

ゲームエンジンでのCGコンテンツ制作において、ライトベイク(ライティング情報の事前計算)は非常に重要なプロセスです。通常はゲームエンジンのライトベイクシステムを使用する場合も多いと思いますが、ライトベイクの品質の問題と制作環境の制約から、DCCツールをつかったライトベイクをする場合もあると思います。

今回は使用者の多いGPUレンダラーのRedshiftを使って、ライトベイクをする方法をまとめてみました。

ライトベイクの基本概念

ライトベイクとは

ライトベイク(Light Baking)とは、3Dシーンの照明情報を事前に計算し、テクスチャとして保存するプロセスです。これにより、主にゲームエンジンでは、複雑な照明計算を実行時に行う必要がなくなり、パフォーマンスが向上します。

特に、昔のゲームやモバイル環境やVR環境といった、パフォーマンスに制限がある環境での使用を想定していて、特に静的なシーンやインタラクションの少ない環境では、ライトベイクによって高品質な照明効果を低負荷で実現できます。

Redshiftを使用する利点

Redshiftは、GPUベースのレンダリングエンジンで、従来のCPUレンダラーと比較して非常に高速です。

今となっては、GPUレンダラーはだいぶ増えましたが、昔はあまり選択肢がなく、Redshiftの高速なレンダリングに感動した人も多かったかと思います。

Redshiftの特徴として、

  • GPUの並列処理能力を活かした高速レンダリング
  • 物理ベースのレンダリングによる高品質な結果
  • 使用者も多くOctaneRendererと並んでGPUレンダラーの二大巨頭のイメージ。Maxon系のソフトの使用者や、Houdiniのユーザーが多い気がします。

Redshiftでのライトベイクシーン構築

必要なソフトウェアとプラグイン

僕が試した環境をここに記します。

  • Maya 2024
  • Redshift 3.5.13以降
  • UVPackMaster(UVパッキング専用プラグイン)

プロジェクト設定

効率的なライトベイクのためには、適切なプロジェクト設定が重要です。

Mayaではデフォルトのプロジェクト設定でディレクトリ構造が整理されているので、そちらを活用しましょう。レンダリング結果やライトマップAOVの出力は、デフォルトではimages ディレクトリに保存されます。

UVレイアウトの最適化

ライトマップUVの重要性

ライトベイクの品質は、適切なUVレイアウトに大きく依存します。ライトマップ用のUVは、通常のテクスチャリング用UVとは異なる要件があります。

  • UVが重なり合ってない(オーバーラップ)がないこと
  • UVアイランドごとの間の間隔をとる(テクスチャの解像度による)
  • 重要な面に優先的にスペースを割り当てる
  • 視認性の低い部分は縮小してスペースを節約
  • シームを目立たない位置に配置
  • UV2にライトベイク用のUVマップを設定することで、ゲームエンジン内でのマテリアルと統合すること容易になります。

効率的なUVレイアウト手法

ライトマップ用に最適化されたUVレイアウトの例

image.png

  1. セカンダリUVセットの作成
  2. 自動展開とレイアウト
    • Mayaの自動展開ツールの活用
    • 僕は、UVPackMasterを使用しました。

ライティング

この記事では、サンプルとして以下のポイントを考慮したシーンを作成しました。

  • 複数のライトの配置
  • Global Illuminationの効果を確認できるマテリアルと配置
  • Emissiveマテリアルによる照明効果
  • TileTextureによるBaseColorの設定

image.png

Redshiftでのライトベイクワークフロー

それでは、シーンができたので実際にライトベイクをしていきましょう。

ベイクセットの作成

UVチャンネルを準備したら、ベイクセットを作成し設定します。ベイクセットには、単一〜複数のオブジェクトに適用するベイク設定が含まれます。グループ内の各オブジェクトに対して、それぞれ個別のベイク画像が生成されます。

選択したすべてのオブジェクトに以下のオプションが追加されます:

image.png

これらのオプションから以下の設定が可能です:

  • 画像の解像度を調整
    • 512pxでイテレーションを回して、1024px~4096pxで最終品質のベイクをすると良いです。
  • UV Set : ベイキングに使用するUVチャンネルを選択
    • ライトマップ用のUV2を設定しておき、UVの名前を統一する
  • BakeMembers:ベイクが実行されます。

複数のBakeSetを一括でベイクするスクリプトです。(夜寝る前に回しておく用)

# 複数のBakeSetを一括処理するスクリプト
import maya.cmds as cmds

def bake_all_sets(resolution):
    # シーン内のすべてのBakeSetを取得
    bake_sets = cmds.ls(type="RedshiftBakeSet")
    
    for bake_set in bake_sets:
        # BakeSetを選択して実行
        cmds.setAttr(bake_set + ".width", resolution)
        cmds.setAttr(bake_set + ".height", resolution)
        cmds.select(bake_set)
    cmds.rsRender(bake=True)
        
# スクリプトの実行
bake_all_sets(2048)

このような画像が出力されるかと思います。

image.png

レンダリング設定とAOV

ライトベイクのためのレンダリング設定で設定しておきたい項目は以下です

  • 適切なライトマップ解像度(通常1024×1024〜4096×4096)
    • オブジェクトのサイズ感によって解像度が変わると思います。
  • 十分なサンプル数(ノイズと計算時間のバランス)
  • Global Illuminationの設定
    • Irradiance Cacheの方が計算が早いです。
  • Denoise設定

Redshiftでライトベイクをしたい場合、ベイクするAOVを指定する必要があります。

例えば、ライトマップのみをベイクする場合は「TotalDiffuseLightingRaw」AOVを使用します。

Mayaでベイクセットを作成するには、シーン内のオブジェクトを選択し、Redshiftシェルフから_Redshift->Create Bake Set_ を選択します。

image.png

また、ベイク用のテクスチャの出力をオブジェクトごとに分けたいときは、<Object>タグを使用できます。

TotalDiffuseLightingRawの設定

image.png

これらの設定で出力されるライトマップ画像のパスは、//images/room.TotalDiffuseLightingRaw になります。

Redshfit Lightbakeの制限事項

  • TesselationとDisplacementは対応していません。これらの機能をベイク対象のジオメトリで使用すると、表示の不具合が発生します。
  • ポイントベースの技術(subsurface scattering, irradiance cache, irradiance point cloud)はベイクレンダリングに対応していません。ただし、フォトンとコースティクスは使用可能です。
  • プロジェクションマッピングには対応していません。
  • ベイク処理中の高解像度から低解像度へのテクスチャ変換には対応していません。

ポストプロセスと最適化

そのままの設定だとEXR設定で書き出される画像データはHDR画像のため、露光を調整してLDR画像に変換してあげる必要があります。

HDR画像を方法はいくつかあり

  • ゲームエンジンにインポートして、アセットの設定で露光調整する。(HDRなのでサイズが大きくなる)
  • 画像編集ソフトで露光調整 (より詳細な編集が可能になる)

僕は、PhotoshopのGeneratorプラグインを使用して、露光調整とPNG書き出しを自動化しました。

露光調整時のポイントは、HDR→LDRへの変換時の注意点と同じく、白飛びと黒つぶれを避けつつ、中間調のディテールを保持することが重要です。ゲームエンジンでの見え方を考慮しながら、適度な明るさと暗さのバランスを取ることを心がけましょう。

ゲームエンジンへの統合

ライトマップをゲームエンジンに統合する際のポイント:

  • ゲームエンジン内でのシェーダーの構成のポイントを示します。
    • ディフューズカラーを黒にするか、ディフューズウェイトをゼロにして、ディフューズライティングを削除します
    • ベイクされた画像をシェーダーのインキャンデセント(または放射)カラーポートに接続し、インキャンデセント(または放射)ウェイトを元のディフューズウェイトと同じ値に設定します
    • 画像がEXRとして保存された場合、テクスチャノードのガンマがリニアに設定されていることを確認します
    • 上記の手順は、「実際の」ディフューズライティングをベイクされたディフューズライティングに置き換えます
    • ディフューズポートにテクスチャが設定されている場合は、乗算シェーダーノードを使用してテクスチャとライトマップを乗算してから、インキャンデセント(または放射)ポートに接続します

Unreal Engineでの活用

こちらUE5内で適当に組んでみたシーンになります。

image.png

image.png

  • TexCoordでUV2を指定してライトマップをマッピングする
  • 露光調整パラメータをつける
  • DiffuseとLightmapを乗算する

まとめ

一般的にはライトベイクはゲームエンジン側で行うことが多いと思います。しかし、ゲームエンジンやプロジェクトの制約で、DCCツール側でのライトベイクを求められることもあると思います。先日そのような経験があり、たまたまチーム内で共通のレンダラーがRedshiftでしたので、備忘録的に記事を書いてみました。

この記事がお役に立てば幸いです。

参考資料

https://help.maxon.net/r3d/maya/en-us/Content/html/Baking.html

https://note.com/makototamura/n/n8f47e1e47a8e

GitHubで編集を提案

Discussion