是否存在更高效的定向圆角盒光线相交算法?
求光线与外扩式圆角盒的高效最近交点计算方法
我正在研究隐式几何渲染方案,需要实现定向圆角盒图元的光线相交算法,这是一个小型实验项目,我不擅长自行推导相关数学公式,因此提出此问题。
从原点ro出发、方向为rd的光线与半尺寸为bd的普通盒的相交计算较为简单,代码如下:
void box_intersection (vec3 ro, vec3 rd, vec3 bd) { vec3 m = 1.0 / rd; vec3 plane_hit = -1.0 * m * ro; vec3 plane_offset = abs(m) * bd; vec3 planes_near = plane_hit - plane_offset; vec3 planes_far = plane_hit + plane_offset; float near_distance = max(max( planes_near.x, planes_near.y ), planes_near.z ); float far_distance = min(min( planes_far.x, planes_far.y ), planes_far.z ); if (near_distance <= far_distance) { // handle intersection } }
但计算与均匀圆角盒的相交时,算法复杂度会大幅上升。现有可参考的圆角盒相交算法中,圆角半径是包含在盒尺寸内的,这与使用有符号距离场(SDF)渲染圆角盒的方式不同——SDF方式会将半径“添加”到盒外,使盒在视觉上向各方向扩展半径大小。但我不想使用光线步进方法,而SDF的光线相交需要依赖该方法。
我理解计算点到圆角盒的最近点算法比无光线步进的精确相交算法简单得多,但没想到两者计算量差异如此巨大。考虑到现有参考内容在计算机图形学领域已较旧(ShaderToy示例来自2019年),且不确定是否有更新的方案,我搜索后无果,结果多为包围盒相交方案,不符合需求。
我只需要光线与圆角盒的最近交点,且接受SDF方式中半径“外扩”的设定——若这能简化计算的话。
是否有人了解更高效的、针对外扩式圆角盒的最近交点计算方法?提前感谢!
内容的提问来源于stack exchange,提问作者Chribit
相关产品推荐
相关产品推荐

