Rendererクラスのリファクタリング案
#if文がすごいことになってるのでアルゴリズムごとにきれいに分割したい。
- Direct Illumination Handler (Ray tracing, scanline, etc.)
- Indirect Illumination Filter (Irradiance Caching, Final Gathering, etc.)
- Indirect Illumination Handler (Photon Mapping, etc.)
MLT法はどうやって実装しようか?もうちょっと考える必要があるな。
Pathクラス
とか作ってよく論文に出てくる擬似コードなみの簡潔さでパストレ書きたい。
LightE PathTracer::trace(FVector2& vScr) { EyePath* path = Camera::genPath(vScr); // trace ray while(path->extend()) ; // get contribution from light at each point LightE e(0, 0); const unsigned int nPathLength = path->length(); for(unsigned int i = 0; i < nPathLength; ++i) { e += Renderer->sampleDI(path->getDG(i)) * path->getWeight(i); } return e; }
とか書きたい。
ただ、どうやって速度を出すのかが問題で、pathクラスがvtable持ってたりすると仮想関数コールの嵐になるし。
C++のTemplate使って無理やりDuck Typingでもする?
追記:
コード下書き下書き。意外とinline化できそう?
Rendererクラスのリファクタリング案・改
Pathクラス書いたら妄想が広がってきましたよ。
- Rastalizer (Ray tracing, scanline, micropoly, etc.)
- Direct Illumination Handler (sample from one light/multiple light/IBL)
- Indirect Illumination Filter (Irradiance Caching, Final Gathering, etc.)
- Indirect Illumination Handler (Photon Mapping, IBL, etc.)
ラスタライザって呼ぶのはおかしいような気がするけど、FirstRayの衝突場所を探して、それぞれに対してNPRの場合pMat->shade()又はPathを生成して上記パストレをしたりMLTしたり。
必要に応じてDIハンドラが呼び出されて直接照明サンプリング、必要があればIIハンドラが呼び出されて大域照明サンプリング。
IIハンドラはさらにIIハンドラを入れ子で呼べて、その機構をつかって放射照度キャッシュとか実装。
どれだけ軽く実装できるかが課題。
Material::shade用のRendererInterfaceクラスを改善すればいい感じにNPRと統合できる予感。