在光线跟踪器中使用SVG文件作为纹理

时间:2015-12-06 22:55:50

标签: java svg 3d rendering vector-graphics

我正在创建自己的光线追踪器,以获得乐趣和学习。我想添加的功能之一是能够直接将SVG文件用作纹理。

这样做的简单直接的方法是首先简单地将SVG渲染为另一种“查找友好”的栅格格式,然后将其作为在光线跟踪期间使用的常规纹理。但是我不想这样做

相反,我想直接“跟踪”SVG本身。所以我想知道有没有适用于Java的SVG库,它有一个API可以让它自己以这种方式使用?它需要一些调用作为输入float point2D[]并返回float colorRGBA[]作为输出。

如果不是最好的办法是什么?

1 个答案:

答案 0 :(得分:1)

我对Java库了解不多,但很可能它们并不适合你。主要原因是:

  1. 大多数库都是为了渲染图片,不适合随机查找。
  2. 更重要的是,SVG纹理数据并不能很好地过滤掉。我们知道如何构建良好的图像mipmap并过滤它们很容易减轻光线跟踪器超级采样需求的压力。
  3. 然后存在SVG本身的复杂性,类似SVG滤波器(模糊)在随机采样环境中计算会非常昂贵。
  4. 现在如果我们回避选项三(3),这确实是一个非常难的问题,因为它确实需要你进行光栅化或其他不寻常的事情。然后有算法选项:

    1. 您实际上可以在2D中对SVG进行光线追踪。无论如何,这对你来说可能都很合适。因此,您需要做的就是在2D模型中拍摄光线,看看您的采样点是否在形状内部。只需将光线射向任意方向并计算交叉点,看看你的内部是否形状。如果您的形状内部只是你的光线将与形状相交很多次。

      enter image description here

      图片1 :交叉口测试。 (最初发布here)必须排除掠过命中率(大多数追踪者因为这个原因即使在3D中也会认为是错过了)

      将此跟踪与BSP-Tree或Quadtree配对应该可以使其具有足够的性能。您所需要的只是实现与标准光线跟踪器类似的着色器支持,您可以处理alpha和gradfients +一些过滤器,如噪声。但是如果没有大量的抽样,那就没有运气了。

    2. 您还可以将纹理用作mipmap的预计算结果,并且仅在使用具有有限窗口大小的标准库到达尚不存在的mipmap级别时请求渲染小视图框。这对您来说自然会更好,通过缓存数据,您可以删除调用次数。没有缓存,使用它可能太昂贵。但你可以尝试,(如果系统支持剪辑你的svg)。这可能不像听起来那么容易。

    3. 你可以使用你的3D光线追踪器,所以你可以直接拍摄光线。您需要做的就是实现跟踪集逻辑,然后您可以对SVG进行三角测量并使用正常的跟踪逻辑来执行此操作。如何将贝塞尔曲线描述为三角形in this nvidia publication。所以你的改变可能很小。

    4. 希望这有助于即使它不使用此库答案。有一个原因,你不经常看到这种情况。