LoginSignup
0
0

More than 5 years have passed since last update.

Embree3 でレンダラを書くときの tips

Last updated at Posted at 2018-11-30

最大レイ距離

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 で追跡するスレッドとは別で rtcEnableGeometryrtcCommitScene を呼ぶとクラッシュします.

インタラクティブレンダリングなどで, レンダリングスレッド(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 対応版)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0