用于raytracer的OpenGL或CUDA / OpenCL?

时间:2015-01-22 23:47:48

标签: opengl cuda opencl

我读过许多光线追踪者使用CUDA或OpenCL。但是,我不知道为什么不使用现代(版本4.0+)OpenGL。 我知道CUDA和OpenCL有更多的功能,我认为它们更接近硬件,但是......这对于这个目的真的有用吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

OpenGL设计就是将点,线或三角形光栅化为帧缓冲区。着色器用于控制此过程,但最终只是光栅化。当光栅化时,逐个拍摄每个三角形,确定它在帧缓冲区中的位置,然后操纵这些特定的像素。

光线追踪或路径追踪是完全不同的。您不是从确定要触摸哪些像素的三角形开始,而是从像素开始,并且每个像素跟踪到场景中哪个几何与像素相关。即它是OpenGL所做的一种补充。因此,试图将其融入OpenGL是一种咆哮错误的树。您需要使用完全不同的数据结构,您的程序结构与着色器不同。 OpenCL和CUDA更适合编程光线或路径跟踪算法。

答案 1 :(得分:1)

OpenGL和更通用的并行计算机制(如OpenCV或CUDA)都可用于实现各种光线投射,包括光线跟踪。事实上,如果你去Shadertoy,你会发现许多着色器只使用一个片段着色器产生有趣的3D场景和效果,尽管大多数使用光线行进而不是光线追踪。

对于任何类型的光线投射,您通常会对要渲染的每个像素执行大量计算。由于没有像素取决于任何其他像素的输出,并且由于每个像素的算法是相同的,因此这种问题对于并行处理是理想的,这是OpenCV设计的核心。您还可以使用OpenGL进行并行计算。这里OpenGL的主要优点是,如果您尝试实时渲染某些内容,那么您希望计算结果保留在视频卡上,从而在输出设备上显示。

另一方面,如果您正在进行非实时渲染,那么OpenCV可能具有更多功能,并且可以减少完成手头任务所需的开销。

在任何一种情况下,最大的问题可能不是渲染器的实现,而是找出直接在渲染代码中表达场景描述的方法,或从某些场景描述符文件加载它并以某种方式对其进行编码渲染代码可以在OpenCV或OpenGL框架内解释。例如,您不能简单地加载一些XML或JSON场景描述文件并将其传递给OpenCV内核/ OpenGL片段着色器。最终,它必须以你所选择的语言表达的任何种类的结构和原语来表达。