Tiled and mip-mapped texture data structure.

by syoyo

レンダラでテクスチャキャッシュを使うにあたって、
まずは、jpeg などの画像をタイル(64×64
などのピクセルブロックで持つ)化し、
またミップマップを事前計算してファイルにテクスチャデータを保存するフレームワークを
angelina に書いてみました。
(prman の texmake
とかもこれと同じような処理をしているはず)
書き出すときには、zlib でデータを圧縮するようにしています。


http://lucille.atso-net.jp/svn/angelina/texturing/tiledmipmap/

ただ、このままではまったくまだまだ使い物にはなりません。
(実際、
ファイルからテクスチャデータを読み出して貼り付けるというとこまでまだ実装していない)

ここから、異方性テクスチャリングのために Rip-map にも対応、

単純な平均和でないミップマップフィルタ処理、
ミップマップ時のボーダーの処理、
non-power-of-two な大きさの画像サイズへの対応、

テクスチャ時のフィルタを考えて、
あらかじめタイルにフィルタ幅ぶん
余分にピクセルを取っておくかとか、
実際に使えるものにするにはいろいろと
こまごました処理が追加で必要になります。

とりあえずは初期テストとして、8192 * 8192
の解像度くらいあれば十分だろうと思い、
8192 * 8192 の jpeg ファイルを作成して、
このフレームワークを使ってテクスチャを作ってみましたが、、、、

アホにみたいにスワップファイルにガリガリアクセスし、5
分くらいコンバートに
時間がかかってしまいました。

よく考えたら、内部では色は fp32x4 で持つようにしているので、
単純に考えてテクスチャだけで
8192 * 8192 * 16 = 1GB
も使っていることに気がつきました。mipmap
用や作業用にさらにメモリを確保しており、
実行中にシステムモニタを見ていたら、最大の時には メモリ +
スワップで 3 GB くらいも使っていました。
( 64bit kernel な linux で実行したので、問題なく
2GB 以上の仮想メモリ量も使えたようです)

うーん、コンバートするときも、

o 画像ファイルをまず一部だけ読み込み
o タイル化・ミップマップ化して書き出し
o 繰り返す

するようにして、メモリ使用量を減らす必要がありそうです。

Advertisements