Google

2016年11月24日木曜日

RuntimeSTLLoaderのカラー表現方法

前回も紹介記事だったので恐縮ですが、
無事リリースも書き終わったRuntimeSTLLoader ver1.3.0の件で補足です。


RuntimeSTLLoaderリリース記事(イノベーションズアイサイトへ)


今回のテーマはSTLフォーマットと色に関する事です。
STLは元々色が存在せず、バイナリフォーマット版だけがカラー対応可能である件は前回話しました。
そのバイナリ形式ならなぜ色情報を含められるのか?という点を解説します。
C言語とか古い時代からプログラミング経験があるならもうお察しかも知れません。

それは、データの中にある「フォーマットのスキマ」を使っているからです。

かなりフザけた絵ですがw
バイナリ形式のSTLデータには各ポリゴンの頂点情報が埋め込まれているのですが、そこには結構なスキマが決め事として存在しています。
構造体に隙間ができる事が常識だったC言語の時代を想定していたのかも知れません。

ちなみにその量は1つのポリゴン情報に付き16bit分。
元々STLはポリゴン数が多くなる傾向にあるため結構無駄です。

白黒STLモデルデータのダンプです。中に00 00が多々あるのが解りますでしょうか?
白黒データでは使われていないので00 00が入る事が多いようです。
この16bitを3つに分解し、5bitずつRGBの情報を格納してるのが今回サポートしたカラー方式です。
つまり、表現できるのは「RGB555」という事になる訳です。

5x3=15bitということで、残った1bitがあるのですが、、、、
これについては私が知る限り2パターンの使い方が存在しています。
  • 無視する
  • 1なら色を適用し、0なら適用しない
後者の0なら適用しないという方は「じゃあ0だったらポリゴンは何色にするんだ」という情報が殆ど見当たらず、面倒くさいので前者の方式を使う事にしました。
(白だとは思いますがその確証が無いですし)

しかしSTLにはテキストフォーマットというのもあります。
じゃあテキストはなんで入らないの?という事になるのでしょうが、テキストはスキマを残すという概念が無いのが要因です。
以下のSSはテキストフォーマット版のSTLをエディタで開いた状態です。

こんな風に、秀丸で開けるような簡単な形式です。
ここにカラー情報を入れ込む余地は無く、無理に入れれば他のSTLビューアがエラーを起こしてしまうかも知れません。
これはもう、STL拡張方式を決めるとか、別のフォーマットで代替するとかしないと駄目ですよね。
という事で、バイナリだけスキマの情報を使うという姑息な手段で埋め込んでいるという次第です。

そして今回のカラー表現、実はテクスチャを使っていません。
簡単に言うとポリゴン自身に色を付けるという方式でこのカラーリングを実現しています。
5bitずつ色情報を入れてしまっている以上、アルファ情報は入れる余地はありませんが。

これがカラーSTL専用のマテリアルです。Diffuseベースですが色指定はありません。反映濃度だけ設定可能です。
最初は色情報をテクスチャとして生成することも考えていたのですが、マテリアルの生成数やUVマッピングの逆算、テクスチャ生成等のコストが恐ろしい量となってしまうことが判明し断念しました。
そもそも色表現なんて無限の組み合わせなんですから仕方ないのですが、それに早く気が付くべきだったという、情けない経緯があった訳です。

書いていたら長くなってきたので、後1回書きます。
次回は頂点カラーとプレハブの話です。

0 件のコメント:

コメントを投稿