texture caching

by ますお

テクスチャはメモリ食いの王者です.

リアルタイムレンダリングでは,テクスチャメモリの容量に制限があるため,あるシーンで使えるテクスチャの量に大きな制限があるのが一般的ですが,実はソフトウエアレンダリングでもメモリを圧迫する一番の要因はテクスチャです.

我々が製作する映像の場合,テクスチャは4Kで描かれる事が多く,各チャンネル8bitだとしてもそのデータサイズは約50MB,alpha付きだと約67MBにもなります.

もちろん1オブジェクトにつき1枚ではありませんから,シーン全体だと相当な量になります.”CATWOMAN”ではvirtual CATWOMANに約40枚のテクスチャが使われました.全てが4Kではありませんでしたが,確か全部で1.2GBくらいあったと思います.

この量を全部メモリに展開してしまうと,ジオメトリや計算に必要なメモリが全く足りなくなってしまい,レンダリングが不可能になってしまいます.

これを防ぐために,大規模な製作で使われる事を想定しているレンダラは,texture cachingと呼ばれる機能を持っています.

これは単に読み込んだテクスチャをキャッシュしておくのではなく,テクスチャの部分読みをし,その断片をキャッシュして再利用する仕組みです.

どのように断片化するかは実装の仕方が色々とあると思いますが,大抵はグリッドで区切るだけでも十分効果があると思います.あとはshading pointのUV座標に従って,そのグリッドの中から一つの領域のみを読み込むようにします.

こうする事で,どんなに巨大なテクスチャファイルでも,あるshadingの計算で必要な部分のテクスチャだけを読み込こむ事が可能になり,メモリの消費を最小限に抑える事ができます.

これは非常に重要な機能の一つで,これがサポートされていないと正直言って製作には使えません.それだけcriticalな機能です.

テクスチャのキャッシュに使われるメモリの量は,レンダリング時のパラメターで,このサイズから溢れた場合は一番優先度の低い物から順に削除され,再度必要になった場合はまたファイルから読み出す必要がありますから,キャッシュに使用できるメモリサイズがあまりに少ないと,レンダリング時間が長くなってしまいます.

関係ありませんが,「これが解決しないとこの作品は完成できない!」というくらい重要な事柄を,”show-stopper”と呼びます.凄く重要そうでしょ?texture cachingはまさにshow-stopperです.