Unityのリニアライティングと.pvrの問題


Unityは5以降では.pvr v3やktxといった、よりハードウエアに密着したテクスチャファイルフォーマットを未加工にインポートすることができるようになりました。
しかし、このことが問題になる場合があります。

Unityのレンダリングモード

Player Settings の Edit -> Project Settings -> Player -> Other Settings
でRenderingでカラースペースを設定できるようになりました。


これがLinearになっていると、リニアライティングという物理的により正しい計算によるライティングになります。ただしテクスチャなどのレンダリングのもとになるソースがどのようなカラースペースで作られているかを正しく設定しなければなりません。

.pvrファイルを作る(れない?)

.pvrを作るにはどうすればいいか?
たぶんImagination TechnlogiesのPowerVR SDKを使用するの一択でしょう。
たとえば、PVRTexToolGUI

しかし、このツールには大問題が、、
pngだろうがtgaだろうがjpgだろうが、読み込んだ外部形式のファイルのカラースペースをすべてLinearと判断します。pngみたいなカラースペースを明示するフィールドがあるフォーマットでもです。
pvr形式のファイルを読み込むときには、さすがにしっかりカラースペースを認識するので機能として持っていないわけでもないよう。
仮に100歩譲って読み飛ばすにしても、そこはせめてデフォルトをsRGBのほうにしておいてほしいのですが。。Linearスペースのイメージデータなんて普通存在しないでしょう。
この結果として、入力が間違っているのですから変換して出力された.pvrファイルのカラースペースもすべて間違っていることになります。
LinearスペースはsRGBで、sRGBはsRGB^2なんて謎のガンマがかかって間違って出力されてしまいます、、、
そもそも、このツール、データ詳細にカラースペースがないので、イメージデータが今どのカラースペースにあるかを知る方法もないのですが(使いにくい)。

結論から言うとPowerVR SDKのツールで正しいカラースペースの.pvrファイルを作るのは困難だといわざるえません。
ソースとして、Linearスペースのpngやtgaを用意してってなかんじになってしまいますから、、そんなデーター普通ありません。
あとはpvrファイル出力後バイナリーエディタでカラースペースのフラグを操作するとか、、今回はLinearスペースで出力後(実はsRGB)、バイナリーエディタで書き換えて無理やりsRGBにしてしまいました(コレデOK?!)

.pvrファイルを読む(めない?)

さてどうにか出来上がった.pvrファイルをUnityで使ってみましょう。
Unityはレンダリングモードがgammaのときイメージファイルのカラースペースを全部sRGBと判断するようです。まあ、普通に我々が入手したり加工したりできるイメージファイルは圧倒的にsRGBカラースペースのものが多いですから、こりゃ妥当っていえば妥当かな?!
で、レンダリングモードをLinearにかえてやると、Unityはイメージファイルのフォーマットを元に正しくカラースペースを設定し物理的により正しいレンダリングをおこない 、、、、、いやいや、正しく判断しませんねえ 、、.pvrファイル場合はすべて無条件でLinearカラーと判断されてしまいました
UnityもImagination Technlogies同様、フラグはガン無視です
PVRTexToolGUIといいUnityといい、この人たちはどれだけLinearスペースのイメージが好きなんでしょう。
まあ、対処はPVRTexToolGUIのときとほぼ同じ、ソースとしてLinearスペースの.pvrしか使わないということでしょうか、、しかしそもそもPowerVR SDKのツール側の問題でLinearスペースの.pvrファイルというもの自体なかなか作れなさそうなんですが。。

sRGBの.pvrファイルを使ってレンダリングするとテクスチャのカラースペースをLinearと誤認識するせいでユニティちゃんが白っぽくなってしまう。

結論

Unityのリニアライティングモードでは.pvrファイルは使えない(調べてないけど、.ktxとか.ddsもやばそう)