用于光线追踪器的 OpenGL 或 CUDA/OpenCL? [关闭]

Posted

技术标签:

【中文标题】用于光线追踪器的 OpenGL 或 CUDA/OpenCL? [关闭]【英文标题】:OpenGL or CUDA/OpenCL for raytracer? [closed] 【发布时间】:2015-03-21 22:49:47 【问题描述】:

我了解到很多光线追踪器都使用 CUDA 或 OpenCL。但是,我不知道为什么不使用现代(4.0+ 版)OpenGL。 我知道 CUDA 和 OpenCL 有更多的功能,我认为它们更接近硬件,但是……这真的有用吗?如果有,为什么?

【问题讨论】:

【参考方案1】:

OpenGL 设计就是将点、线或三角形光栅化到帧缓冲区。着色器用于控制这个过程,但最终它只是光栅化。光栅化时,您逐个获取每个三角形,确定它在帧缓冲区中的位置,然后处理这些特定像素。

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

【讨论】:

【参考方案2】:

OpenGL 和更通用的并行计算机制(如 OpenCL 或 CUDA)都可用于实现各种光线投射,包括光线追踪。事实上,如果您访问 Shadertoy,您会发现那里的许多着色器仅使用单个片段着色器即可产生有趣的 3D 场景和效果,尽管主要使用的是光线行进而不是光线追踪。

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

另一方面,如果您正在进行非实时渲染,那么 OpenCL 可能具有更多功能和更少的开销来完成手头的任务。

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

【讨论】:

以上是关于用于光线追踪器的 OpenGL 或 CUDA/OpenCL? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL Alpha混合错误的颜色

OpenGL chapter2

Threejs中用于无线光线追踪的自定义渲染器和灯光?

光线追踪(RayTracing)算法理论与实践入门

2 追踪光线=》2.7 透射光线

球体光线追踪