🩻

embree で user geometry + node transform のメモ

2024/11/26に公開

https://github.com/RenderKit/embree/blob/master/tutorials/user_geometry/user_geometry_device.cpp

に例がある.

  • Bounds
  • Intersect(実際に交点を求める)
  • Occluded(交点は求めず, 遮蔽されているかどうかだけチェック. shadow ray とか用)

の 3 つの関数を提供してあげる必要がある.

さらに, Intersect, Occluded では, 内部で Intersection filter function を呼んであげる必要がある.
(Intersection filter を使わないのであればスキップ可能)

動的に Shape(node) を Xform したい

geometry に対して

rtcSetGeometryTransform
rtcCommitGeometry
rtcCommitScene

ではうまくいかないっぽい.

一度 Geom から Scene を作り, Scene に対して Instance Geom を作ってあげる必要がある.
その Instanced geom(中身は scene)に対して rtcSetGeometryTransform する.

あと, rtcSetSceneFlags で RTC_SCENE_FLAG_DYNAMIC を設定しておくとよい.

https://github.com/RenderKit/embree/blob/master/tutorials/user_geometry/user_geometry_device.cpp

には, Native instancing 版とそうではない版の両方がある.
Native instancing は ray などの xform を Embree 側に行わせる, そうではないほうは instanced geom も user geometry として扱い, 自前で xform させる.

とくにこだわった処理が必要でなければ, Native instancing 版を使うとコード量もすくなくてよいでしょう.

あと, intersection function には, inverse xform'ed された ray 座標が入ってくる

intersection function でのレイの座標

intersection function などではレイの位置と方向は, instance xform の inverse を取ってxform されている(shape の local 座標に変換されている)ので注意する.

レイの絶対座標を使ってなにか判定処理とかする場合は, 自前でレイ座標を再度 xform してあげるなどの対応が必要となる

Discussion