最大レイ距離
Embree3 では, 扱える floating point(32bit)の最大が
FLT_LARGE = 1.844E18f;
に設定されています. これは std::numeric_limits<float>::max()
よりも小さいので, std::numeric_limits<float>::max()
をレイの最大距離に設定していると, まったく交差しないという結果になりますので注意ください.
アルファテクスチャでの透過対応
rtcIntersect
したあとにレンダラ側でシェーダとテクスチャを評価してアルファを取得し, アルファがあれば透過マテリアルとしてレイの throughput を減衰してレイの追跡を継続するというのが標準的なやりかたですが, これだといくらか効率が悪いので, intersection filter(交差判定時にカスタムコールバックを仕掛けることができる)で対応することができます.
Embree tutorials の intersection_filter
を参考ください.
shadow ray
どこかに当たるか当たらないかだけがわかるのでよければ rtcOccluded を使います. shadow ray の追跡で透過やアルファを含んだ形状を考慮する場合は, 上記 intersection filter で対応するのがよいでしょう.
node visibility
rtcEnableGeometry/rtcDisableGeometry があります. 変更後は rtcCommtiScene が必要になります.
Embree の API は multi thread safe でないようなので, rtcIntesect
で追跡するスレッドとは別で rtcEnableGeometry
や rtcCommitScene
を呼ぶとクラッシュします.
インタラクティブレンダリングなどで, レンダリングスレッド(rtcIntersect を呼んでいるスレッド)とシーン編集/描画のスレッドをわけている場合, シーンの変更は一度別途キューにいれておき, アトミックに同期をとってから更新系 API を呼ぶことになります.
ray visibility
ray による visibility(visible from eye ray, visible from specular ray, etc) を対応したい場合は IntersectionFilter を使って実現します.
Multi-hit
subsurface で multi-hit が欲しい場合, rtcOccluded に filter を入れて, filter で N 個までの交差リストを作る感じで対応できる... はず?
参考文献
- OSPRay
- Cycles(Embree 対応版)