漢なら tx テクスチャ(tiled TIFF テクスチャ)を自作のレンダラで読みたいですね!!
.tx は, OpenImageIO で作成できるテクスチャ形式で, 事前に tile 化 + mipmap 処理をします.
Arnold とかで使われていたりします.
やりましょう!
できました.
Added API of loading DNG/TIFF from memory, and also added support for decoding OIIO's .tx(tiled ZIP-ed TIFF texture) in header-only C++ DNG loader library TinyDNGLoader! 🎉🎉🎉㊗️㊗️㊗️㊗️💪💪💪💪😎😎😎😆😆😆🍺🍺🍺 https://t.co/sgLCGM7SEc pic.twitter.com/yRiU1YXCfO
— Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) 2018年11月8日
.tx 構造
LDR 画像(jpg など)を maketx で処理すると, ZIP 圧縮の tiled TIFF がデフォルトになります.
(maketx のオプションでフォーマットを変えることができる? かも? OpenImageIO のソースを見ればわかるでしょう)
TinyDNGLoader はもともとはデジカメとかの DNG 画像(10 ~ 16bit Bayer 画像とか)のローダーを目指して作成していましたが, DNG も中身は TIFF フォーマットであるので, 多少の変更で .tx を読むことができました.
また, TinyDNGLoader では, 今までは FILE ポインタからパースをしていましたが, メモリ上から TIFF 画像をパースできるようにもしました. 現状は読み込んだ画像は全部 De-tile して一枚の画像(のレイヤー)にしていますが, タイルへのオフセットだけを保持しておき, 遅延読み込みをするという拡張もしやすくなっています.
少しハマった点
maketx では 64x64 のタイルサイズで mipmap を作っていきますが, 1x1 くらいになるまで繰り返すので, 画像サイズが 16x16 だけども tile size が 64x64 でデータが保存されているとかがあります.
TIFF の場合, 1 画像に 1 tile だけの場合は画像データへのオフセット値の取り方が異なります(TileOffset tag で取得したオフセットを使う)
TODO
- HDR 画像や, 12bit 画像などを maketx で処理するとどうなるか調べる
- Tile の画像のまま読み込むオプションをつける
- 遅延読み込みできるようにする.
- 優秀な若人さまが, 人類史上最速で優秀なレンダラ書き若人へと昇華なされるスキームを確立する旅に出たい.