【问题标题】:Ray-Volume Intersection in OpenGLOpenGL 中的光线体积交集
【发布时间】:2016-12-29 14:49:12
【问题描述】:

我正在制作体积渲染器。我已经成功阅读了这本书,并且我的光线追踪器已经准备好了一些课程。现在的问题是如何做Ray和Volume(它的大小是256 * 256 * 256)相交以找到坐标'intersectFront'和'intersectBack'?

在我的光线类中,我可以获取光线的原点和方向。

我尝试应用Liang Barsky Algorithm,但想不出如何将它应用到盒子(立方体/体积)。

【问题讨论】:

    标签: c++ opengl visualization volume-rendering


    【解决方案1】:

    您所指的算法似乎认为剪辑窗口是轴对齐的。在体积渲染的情况下,您可能希望在可视化期间操纵体积的方向。这使得立方体非轴对齐。

    此外,您似乎是在 CPU 上进行光线投射,而不是在 openGL 着色器中。在 openGL 着色器中,计算 'intersectFront' 和 intersectBack' 点非常容易。您首先将体积的边界框两次渲染到纹理中。第一次渲染用于正面,第二次渲染用于背面。边界框的顶点使用框的轴对齐坐标着色。然后可以将这两个纹理重叠,以根据 3D 纹理坐标找到相交光线。 有关更多详细信息,请查看此帖子: volume rendering (using glsl) with ray casting algorithm.

    如果您在 CPU 上执行此操作,最好的办法是将立方体/边界框转换回来,使其与当前光线轴对齐。 然后你可以应用上面提到的 Liang Barsky 算法,使用框的扩展为 x_min, x_max, y_min, y_max, z_min, z_max。

    【讨论】:

    • 感谢您的意见。我现在在CPU上做。现在,暂时假设我不想旋转音量。我只是想看看我的音量(光线投射)。我无法得到如何将其转换回来并应用梁巴斯基。就我而言,认为一切都是静态的。立方体大小相同,无旋转,位置相同。
    • 如果您的多维数据集已经轴对齐并且是静态的,则无需进行反向转换。只需计算线方程并使用每个维度的最小值和最大值来计算交点。
    • 或者,为了更简单,只需使用正交投影。即你的光线沿着 z 轴传播。但我不会产生一个好的观点。不过,这将是一个很好的起点。
    • 我实现了和你说的一样,但没有在屏幕上看到任何东西。这是我的代码pastebin.com/VewEWH4Z
    • 我看到你在 intersect() 函数中传递了对象 Ray r 但你没有使用它。你用什么线来计算剪裁?您必须使用光线(根据透视计算)来形成两个参数方程。
    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多