PBR->C++ コードジェネレータ
これ本当に有用なのか疑問に思えてきた。
速度的なアドバンテージは大きいか?
当時はシェーダ内で仮想関数コールなんてしてたら遅くて使い物にならないだろうと思ってC++コードジェネレータに走ったのだろうけれども、実際nytrはもっとinner-loopのレンダリングアルゴリズム本体の方で仮想関数コールを多用している。*1
実際filterを実装してみたところ、ObjIDレンダリング有りの場合と無しの場合、レンダリング時間の差異は誤差の範囲内であった。そもそも、よっぽど軽いシェーダでもない限り、仮想関数コールの影響は見えない。テクスチャ参照が一回入るだけでも膨大なメモリ参照が生じる。
どうする?
ShaderBlockのモジュールだけC++で作っておいて(これは今まで通り)、構文木というかシェーダツリーをPBSファイルから動的に作成&レンダリング?(以前の予定ではHard-coded C++)
結局C++コード生成→リンクだった構文木解釈を動的にしただけ?
多チャンネル出力用に作ったSampleValがうまい具合で使えそう。実装はreinterpret_castしまくりだが、オーバーヘッドはその出力が必要かどうかの分岐一回。(単出力のShaderBlockでは省略可)
もうちょっと考える。
追記:
本当に木構造(枝同士がつながるのは無し)をとっていないとパースできないな。同じテクスチャ・同じ座標への参照があった場合2回参照することになってしまう。これはまずい。
ただキャッシュすればいいだけの話。
*1:PhotonMapやIrradianceCacheをDecoratorパターンで実装している