我正在创建自己的光线追踪器,以获得乐趣和学习。我想添加的功能之一是能够直接将SVG文件用作纹理。
这样做的简单直接的方法是首先简单地将SVG渲染为另一种“查找友好”的栅格格式,然后将其作为在光线跟踪期间使用的常规纹理。但是我不想这样做。
相反,我想直接“跟踪”SVG本身。所以我想知道有没有适用于Java的SVG库,它有一个API可以让它自己以这种方式使用?它需要一些调用作为输入float point2D[]
并返回float colorRGBA[]
作为输出。
如果不是最好的办法是什么?
答案 0 :(得分:1)
我对Java库了解不多,但很可能它们并不适合你。主要原因是:
现在如果我们回避选项三(3),这确实是一个非常难的问题,因为它确实需要你进行光栅化或其他不寻常的事情。然后有算法选项:
您实际上可以在2D中对SVG进行光线追踪。无论如何,这对你来说可能都很合适。因此,您需要做的就是在2D模型中拍摄光线,看看您的采样点是否在形状内部。只需将光线射向任意方向并计算交叉点,看看你的内部是否形状。如果您的形状内部只是你的光线将与形状相交很多次。
图片1 :交叉口测试。 (最初发布here)必须排除掠过命中率(大多数追踪者因为这个原因即使在3D中也会认为是错过了)
将此跟踪与BSP-Tree或Quadtree配对应该可以使其具有足够的性能。您所需要的只是实现与标准光线跟踪器类似的着色器支持,您可以处理alpha和gradfients +一些过滤器,如噪声。但是如果没有大量的抽样,那就没有运气了。
您还可以将纹理用作mipmap的预计算结果,并且仅在使用具有有限窗口大小的标准库到达尚不存在的mipmap级别时请求渲染小视图框。这对您来说自然会更好,通过缓存数据,您可以删除调用次数。没有缓存,使用它可能太昂贵。但你可以尝试,(如果系统支持剪辑你的svg)。这可能不像听起来那么容易。
你可以使用你的3D光线追踪器,所以你可以直接拍摄光线。您需要做的就是实现跟踪集逻辑,然后您可以对SVG进行三角测量并使用正常的跟踪逻辑来执行此操作。如何将贝塞尔曲线描述为三角形in this nvidia publication。所以你的改变可能很小。
希望这有助于即使它不使用此库答案。有一个原因,你不经常看到这种情况。