HDRレンダリングをするときにはレンダーターゲットに浮動小数点バッファを指定します。
ただ、モバイルで浮動小数点バッファってそもそも使えるの?
という点がわからなかったので調べてみました。
(はっきりとした結論は出ていません。詳しい方ご指摘いただけるとありがたいです)
そもそもGPUが対応してるのか?
そもそもモバイルのGPUは浮動小数点バッファを取り扱えるのでしょうか?
HDRのマニュアルを見てみると、「Not supported on all hardware」となんともあいまいな書き方をされています。
Unity - Manual: High Dynamic Range Rendering
下記の記事によると、SM2.0から登場しているようなので、モバイルでもかなり古い端末以外は使える感じでしょうか。
また、中国語なのでよくわかりませんが、下記の記事に重要そうなことが書いてあります。
Unity使用mobile渲染管线时无法使用HDR?有没有什么解决办法,或者解决思路? - 知乎
自動翻訳なのであってるか自信ないですが要約すると次のようになります。
- 64ビットの浮動小数点テクスチャはOpenGL ES3.0の端末でもサポートしない場合がある
- RGB10A2形式(32ビット)ならOpenGL ES3.0で標準なので多くの端末をカバーする場合はこれを使うべき(擬似HDR)
- Tier設定で性能が低い端末の設定を変えてもいいが、もし設定したテクスチャ形式がサポートされていなかった場合にはRGBA8888になりHDR効果がなくなってしまう
パフォーマンスは?
浮動小数点バッファを使うとパフォーマンスは問題になりやすそうです。
GPUの処理負荷が高くなり、メモリの消費量も大きくなります。
他の描画内容やハードウェア性能にはよるものの、モバイルで色々とリッチな表現を盛り込みたいなら処理負荷は問題になってきそうです。
パフォーマンスを稼ぐなら疑似HDR
パフォーマンスを下げたくないがHDRをやりたい場合には擬似HDRという手法がありそうです。
これは32ビットバッファ(LDR)にHDRの情報を格納する手法です。
色の精度は落ちますがパフォーマンスは浮動小数点バッファを使うよりよりずっとよさそうです。
結論
モバイルにおける浮動小数点バッファについては下記のことがわかりました。
- 一部端末は浮動小数点バッファに対応していなそう
- パフォーマンスは幅広い端末をカバーしたり負荷を攻める場合にはネックになりそう
対象プラットフォームやゲームの内容にもよりますが、
安全策で言えば擬似HDRが良い気がします。
ただハードウェアの性能向上とともに浮動小数点バッファが実用的になる将来は近々来そうなので、
32ビットと64ビットを簡単に切り替えられるような設計をしておくというのが現状採るべき戦略なのかなと思いました。