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化できそう?
メモ&TODO:
- BRDFのreciprocity使ってPath::extendは共有できるか?
- コンストラクタに渡されたレイで衝突が起こらなかった場合はどうするの?
- Invalidマークをつけるといってもメモリ確保時のオーバーヘッドが?
- placement new推奨しとく?
- Invalidマークをつけるといってもメモリ確保時のオーバーヘッドが?
#define PATH_MAX_LENGTH 8 class Path { protected: //! protected default C-tor Path(); //! extend path length by one inline bool extend(); // ------ accesor methods ------ 略 public: DiffGeom m_DG[PATH_MAX_LENGTH]; FVector3 m_vWi[PATH_MAX_LENGTH]; REAL m_fImportance[PATH_MAX_LENGTH]; unsigned int m_nPathLength; }; class EyePath : public Path { public: //! C-tor EyePath(const FVector3& vEye, const FVector3& vPhi); ←コンストラクタで一回目の衝突地点は記録する。(そうしないとextend共有不可) // ------ accesor methods ------ 略 private: FVector3 m_vEye; }; class LightPath : public Path { public: //! C-tor LightPath(const FVector3& vLight, const FVector3& vTheta); //! private: FVector3 m_vLight; }; //! for Metropolis Light Transport class FullPath : public Path { };