UnityでライトをGPUベイクするときのOpenCL Error

(6/27解消方法について追記あり)

Unity2019.4をメインで使っていたのですが、作っているシーンが大きくなり、更にリッチなマテリアルを使っていたところ
ライティングのGPUベイク時に「OpenCL Error」というのが多発するようになりました。
私はRTX2060を搭載したPCを使っているのですが、こんなメッセージが出ます。

OpenCL Error. Falling back to CPU lightmapper. Error callback from context: CL_MEM_OBJECT_ALLOCATION_FAILURE

特にプロジェクトをHDRP化した後、これが頻発し途方に暮れていました。

色々と調べたところ、Unity公式サイトのマニュアルに以下の記載がありました。
Note: If the baking process uses more than the available GPU memory, the process might fall back to the CPU Lightmapper.」

日本語に翻訳したのがこちら。
「注:ベイク処理で使用可能な GPU メモリを超える量を使用する場合、プロセスは CPU ライトマッパーにフォールバックする可能性があります。」

引用元:The Progressive GPU Lightmapper (preview) – Unity マニュアル (unity3d.com)

つまり、GPUメモリで処理できる量を超えた場合、このエラーが起きてCPUベイクに切り替わるということのようです。単純にメモリ不足、、と。。

ちなみに、Unity2020のマニュアルを見たところ、
「ベイク時間を短縮し、ベイク処理がベイク処理用に指定された GPU で使用できる VRAM を超える状況を回避する方法はいくつかあります。」とのことで以下の記載がありました。

・他の GPU アクセラレーションアプリケーションを閉じる
・CPU ベースのノイズ除去に切り替える
・小さいゲームオブジェクトにはライトプローブを使用する
・レンダリングとベイク処理用に個別の GPU を指定する
・アンチエイリアスサンプルの数を少ない数にする
引用元:The Progressive GPU Lightmapper (preview) – Unity マニュアル (unity3d.com)

とりあえず、手っ取り早いのは、ベイク中は他のソフトを閉じてPCをいじらないということのようです。

また、Unity2020では色々とメモリ処理などが改善されている模様です。実際に、プロジェクトを2020.3にアップグレードしてみたところ、CPUにフォールバックする頻度が大分減りました。
GPUのメモリが不足気味になっても、いきなりフォールバックせず、以下のようにモードを切り替えて、何とかGPUベイクを維持しようとする機能が付いたようです。
(正確にどのバージョンからこうしたものが実装されたかまでは追い切れていませんが・・・)

参考:Unity – Progressive GPU Lightmapper preview – Unity Forum

上記のサイトに、各バージョンでの改善内容の記載があります。
ということで、なるべく新しいバージョンのLTSを選んでいくのが良さそうです。
参考:Unity QA – LTS Releases – Unity (unity3d.com)

(以下、6/27追記)解消方法
今取り組んでいるプロジェクトで Falling back to CPU lightmapper のエラーが頻発していたのですが、プロジェクト設定の、テクスチャ品質を1/2、1/4、・・・・と下げていくとベイク時にGPUメモリを使う量が減り、うまくGPUでベイクできました。ただし、当然のことながらテクスチャの解像度が下がりますのでどちらを優先するか、という問題になります。不要に解像度が高いテクスチャを見直すことなどが望ましいということかと思います。

ほぼUnityに関する記載になりましたが、今回は以上です。

Unity で皿を立体的に「見せかける」(Cubeを使う、影も出す、更にHDRPでよりリアルに表現する)

以前、以下の記事で、Unity上でSpriteを使って皿を配置する方法を記載しました。

バーチャルアートミュージアムを作る(3)作り方 皿のアートを3D空間上に配置する

Spriteの場合、影が付きません。

薄いCubeで皿と影を表現

そこで、Spriteの代わりに薄いCubeを作成し、新規にStandardシェーダのマテリアルを作成、「アルベド」に皿の画像をセット、「Rendering Mode」を「Cutout」、「アルファカットオフ」の値を適当に設定します。

薄いCube
Rendering Modeを「Cutout」に設定

これで、皿の色のついた部分だけを投影してくれます。
一番上のスクリーンショット取得時には、動作を軽くするために壁などのマテリアルもMobile Bumped Diffuseなどの軽いシェーダにしていたのですが、折角なのでStandardシェーダにして法線マップやMetallicなどを設定し、ライトをベイクした結果、下のスクリーンショットのようになりました。皿はほぼ、平面に近いCubeですが、この角度からなら十分立体に見えます。影が付いており、見栄えがいいですね。

 

HDRPで同じシーンを作成してみる

ついでに、同じシーンをハイエンドプラットフォーム向けのHDRPでも作成してみました。
HDRPについては以下サイトをご参照ください。
https://unity.com/ja/srp/High-Definition-Render-Pipeline

先程と同じく、薄いCubeを作成し、マテリアルを作成、シェーダをLit、Alpha Clippingをオン、BaseMapに皿のテクスチャを設定して割り当てます。

 

 

 

 

 

 

 

 

HDRPで同じシーンを作成

美しいですね・・・・

ちなみに、皿をアップで映してUnity標準のビルトインレンダリングパイプラインとHDRPを比べたのが下です。

ビルトインレンダリングパイプライン
HDRP

影の描写も、HDRPでは穴の部分などもしっかり反映されており、形状に忠実になっています。

床などは少しテクスチャも変えていますが、HDRPだと非常に優美な空間が作れますね。ただし、重いですが。

Unity HDRPのLitシェーダでフォトグラメトリのモデルをいい感じにしてみる

Craneです。

Unity HDRPを使って遊んでいます。
HDRPの標準シェーダである、Litシェーダを使ってフォトグラメトリソフトで作ったモデルをそれっぽくしてみました。
影とか、色々と変ですが・・・質感はなかなかです。

周辺のレースドールは皆、Unlitシェーダなので、比べると違いが明らかですね。

“Unity HDRPのLitシェーダでフォトグラメトリのモデルをいい感じにしてみる” の続きを読む

バーチャルアートミュージアムを作る(3)作り方 皿のアートを3D空間上に配置する

Sprite+PNGで皿を立体的に「見せかける」

今回から、Unityを使ってアートミュージアムを作る方法を記載していきます。

現実に存在する作品を、Unity上の3D空間に表示させる方法については以下の手法を使いました。
・3Dのオブジェクトを作り、配置する(フォトグラメトリ※の活用など)
・2Dのオブジェクトを作り、3Dに見せかける
※ フォトグラメトリ:写真などから3Dデータを作る技術

“バーチャルアートミュージアムを作る(3)作り方 皿のアートを3D空間上に配置する” の続きを読む