如何在现代 OpenGL 中进行光线追踪?

     2023-02-27     188

关键词:

【中文标题】如何在现代 OpenGL 中进行光线追踪?【英文标题】:How to do ray tracing in modern OpenGL? 【发布时间】:2011-04-09 16:40:20 【问题描述】:

所以我现在应该开始为我的单色模型照明。测试应用程序是仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线追踪(因为理论上,它可能在几年内成为实时图形的理想选择)。

但是我从哪里开始呢?

假设我从未在旧的 OpenGL 中做过光照,所以我会直接使用非弃用的方法。

应用程序当前已正确设置顶点缓冲区对象、顶点、法线和颜色输入,并且它可以正确地在空间中以纯色绘制和转换模型。

是否有一个信息来源可以从平面彩色顶点到通过 GLSL 获得正确最终结果所需的所有信息?理想情况下,可以使用任何其他可能需要的其他照明方法来补充它。

【问题讨论】:

【参考方案1】:

我不建议在 OpenGL 中尝试实际的光线追踪,因为你需要很多技巧和窍门,如果你问我,这样做根本没有意义。 如果您想在 GPU 上进行光线追踪,您应该使用任何 GPGPU 语言,例如 CUDA 或 OpenCL,因为它使事情变得容易得多(但仍然远非微不足道)。

为了进一步说明问题: 对于光线追踪,您需要追踪辅助光线并测试与几何体的相交。因此,您需要在着色器中以某种巧妙的方式访问几何体,但是在片段着色器中,如果您不将几何体“编码”存储到某个纹理中,则无法访问该几何体。顶点着色器本身也不为您提供此几何信息,并且几何着色器只知道邻居,所以这里的麻烦已经开始了。 接下来,您需要加速数据结构来获得任何合理的帧速率。但是,遍历例如着色器中的 Kd-Tree 非常困难,如果我没记错的话,有几篇论文专门讨论这个问题。 不过,如果你真的想走这条路,关于这个主题的论文很多,应该不难找到。

光线追踪器需要精心设计的访问模式和缓存才能达到良好的性能。但是,您在 GLSL 中对这些功能几乎没有控制权,因此优化性能非常困难。

另一点需要注意的是,至少据我所知,GPU 上的实时光线追踪主要限于静态场景,因为例如kd-trees 仅适用于静态场景(很好)。如果您想拥有动态场景,则需要其他数据结构(例如 BVH、iirc?),但您需要不断地维护这些数据结构。如果我没有遗漏任何内容,那么目前还有很多关于这个问题的研究。

【讨论】:

顺便说一句:谷歌学者是你在这类事情上的朋友。 scholar.google.de/scholar?q=glsl+ray+tracing 怎么样 “加速数据结构”是什么意思? 在这种情况下,加速数据结构加速查询世界是否被特定 3D 位置的对象占据。它比 O(n) 加速,遍历对象列表。 您可以使用 OpenGL 计算着色器来编写光线追踪器。由于已经熟悉编写 GLSL 代码,因此上手可能会更容易。这可能很有帮助:ci.i.u-tokyo.ac.jp/~hachisuka/tdf2015.pdf 虽然我建议使用 SSBO 来存储数据而不是纹理。【参考方案2】:

你可能会混淆一些事情。

OpenGL 是一个光栅化器。强制它进行光线追踪是可能的,但很困难。这就是为什么光线追踪不是“几年内实时图形的理想选择”。几年后,只有混合系统才是可行的。

所以,你有三种可能性。

纯光线追踪。仅渲染一个全屏四边形,然后在片段着色器中读取打包在缓冲区(如纹理)中的场景描述,遍历层次结构,并计算光线-三角形的交点。 混合光线追踪。以正常方式栅格化您的场景,并在您的着色器中对场景中确实需要它的某些部分使用光线追踪(折射,......但它可以在栅格化中进行模拟) 纯光栅化。片段着色器完成其正常工作。

你到底想达到什么目标?我可以根据您的需要改进答案。

无论如何,this SO question 是高度相关的。即使这个特定的实现有一个错误,它也绝对是要走的路。另一种可能是openCL,但概念是一样的。

【讨论】:

从最新的虚幻引擎公告来看,微软(针对 DirectX)和 NVIDIA 似乎刚刚发布了实时光线追踪 API【参考方案3】:

至于 2019 年,光线追踪是实时渲染的一个选项,但需要大多数用户没有的高端 GPU。 其中一些 GPU 专为光线追踪而设计。 OpenGL 目前不支持硬件增强的光线追踪。 Windows 上的 DirectX 12 确实支持它。建议再等几年再创建仅光线追踪的渲染器,尽管可以将 DirectX 12 与当前的台式机和笔记本电脑硬件一起使用。来自移动设备的支持可能需要几十年的时间。我没有看到 openGL 支持光线追踪,但 vulkan 将来会支持它。

【讨论】:

【参考方案4】:

我发现其他一些答案冗长而冗长。对于可以使用 OpenGL API 构建功能性光线追踪器的视觉示例,我强烈建议查看人们在 https://www.shadertoy.com/ 上制作的一些项目(警告:滞后)

【讨论】:

【参考方案5】:

如果你真的很擅长,Opengl 和 glsl 可以同时用于光线和路径追踪。但是,几乎没有其他更好的选择,例如带有 Cuda 工具包的 Nvidia optix、directx 12、vulkan 光线追踪、metal、falcor。请注意,所有这些都是低级 API,可以在 Nvidia 最近的 rtx 技术中获得良好的性能并支持多 GPU

【讨论】:

如何将光线追踪器中的光线从世界空间反向旋转到对象空间

】如何将光线追踪器中的光线从世界空间反向旋转到对象空间【英文标题】:Howtoinverserotatearayinaraytracerfromworldspacetoobjectspace【发布时间】:2020-12-0812:11:18【问题描述】:我目前正在c#中实现光线追踪器,我正在尝试将我的光线反... 查看详情

如何正确处理光线追踪中的折射

】如何正确处理光线追踪中的折射【英文标题】:Howtoproperlyhandlerefractioninraytracing【发布时间】:2017-07-0207:16:38【问题描述】:我目前正在开发一个光线追踪器,只是为了好玩,但我在折射处理方面遇到了麻烦。整个光线追踪器... 查看详情

为啥我们使用 CPU 而不是 GPU 进行光线追踪?

...追踪做了一些研究之后。我发现互联网上没有太多关于CPU如何进行光线追踪的信息。我遇到了关于Pixar以及他们如何在CPU上预渲染Cars2的文章。这需要他们每帧11.5小时 查看详情

3d渲染-光线追踪-包围盒

...写入像素值。解释了Whitted-StyleRayTracing的原理,并讲解了如何进行光线和场景中物体求交问题。之前每一个像素都需要与场景中所有三角形求交。即:algorithm=pixels✖️traingles可以向想象:一个成像平面上有很多个像素,... 查看详情

在光线追踪中为对象着色

...叉点设置一个随机颜色。接下来我需要根据像素值对像素进行着色。我看过10多个教程,阅读了几个关于像素着色的网站。但是,我正在阅读的文件没有对象的颜色。相反,它具有以下内容:RGB颜色的环境光点光 查看详情

是否可以在没有 CUDA/OpenCL 等的情况下使用 GPU 进行光线追踪?

】是否可以在没有CUDA/OpenCL等的情况下使用GPU进行光线追踪?【英文标题】:IsitpossibletouseGPUforraytracingwithoutCUDA/OpenCLetc?【发布时间】:2011-03-0301:58:39【问题描述】:我正在使用不支持CUDA或OpenCL等功能的WindowsPhone7。我是GPU方面的... 查看详情

OpenGL/GLUT - 在对象上绘图

...机。我希望能够在飞机上画画,但我似乎无法弄清楚它是如何完成的。知道鼠标点击的x和y坐标是相当简单的,但是z坐标呢?我需要能够进行某种光线追踪,它会射出一条光线并在它到达物体时立即告诉我。我想知道的是对象上... 查看详情

如何在现代opengl中绘制圆柱体

】如何在现代opengl中绘制圆柱体【英文标题】:Howtodrawcylinderinmodernopengl【发布时间】:2015-10-0109:06:07【问题描述】:我的问题很简单,如何在现代OpenGL中绘制圆柱体?我将GLFW与OpenGL3.x一起使用。我最初的想法是创建一个函数,... 查看详情

2追踪光线=》2.1

...,然后唯一方式是平均所有撞击像素的有色光。但是我们如何找到这些光线呢,它们又是什么颜色呢?确实,所谓的光线的‘颜色‘又到底指的是什么呢?  "光线的颜色"并不难定义。我们可以把光线想象成一个直线路径,一... 查看详情

games202笔记-实时光线追踪

...法,会产生非常大的噪声。所以RTRT的核心技术是降噪,如何从噪声图生成清晰的图。降噪目的是:在1SPP的前提下,进行降噪,达到画面质量要求(没有过模糊,没有artifacts,保留了所有细节),并高效处理。使用切边滤波系列... 查看详情

光线追踪遮挡计算(中心投影)

 前言:在进行三维模型多纹理映射时,纹像素的遮挡计算是不可避免的,也是计算比较大的一个过程;本文利用光线追技术进行纹理像的遮挡计算,然后就可以对遮挡的像素做特殊处理。 图1中心投影图2光线追踪  过程... 查看详情

光线追踪中的折射?

】光线追踪中的折射?【英文标题】:RefractioninRaytracing?【发布时间】:2014-11-2302:10:48【问题描述】:我又开始研究我的光线追踪器了。我添加了反射和多线程支持。目前我正在努力添加折射,但它只工作了一半。如您所见,有... 查看详情

为啥在我的光线追踪器中计算阴影和反射时会丢失细节

】为啥在我的光线追踪器中计算阴影和反射时会丢失细节【英文标题】:Whyisdetaillostwhencomputingshadowandreflectionsinmyraytracer为什么在我的光线追踪器中计算阴影和反射时会丢失细节【发布时间】:2014-12-0919:27:37【问题描述】:我正... 查看详情

球体光线追踪

...发布时间】:2013-11-2503:04:26【问题描述】:我正在用球体进行光线追踪。当我们求解二次方程并得到两个根时,我们需要取哪个值?我的理解是我们需要取最小值。但是,当我将该值用于计算交点和进一步的照明计算时,我得到... 查看详情

GLSL:如何使用投影矩阵计算光线方向?

】GLSL:如何使用投影矩阵计算光线方向?【英文标题】:GLSL:Howtocalculatearaydirectionusingtheprojectionmatrix?【发布时间】:2017-03-0619:10:07【问题描述】:我在使用SDF函数在GLSL中进行球体追踪/光线行进时遇到了一些问题:我的主程序(... 查看详情

计算在基于瓦片的游戏中哪些瓦片被点亮(“光线追踪”)

】计算在基于瓦片的游戏中哪些瓦片被点亮(“光线追踪”)【英文标题】:Calculatingwhichtilesarelitinatile-basedgame("raytracing")【发布时间】:2010-09-1512:52:49【问题描述】:我正在编写一个基于图块的小游戏,我想为此支持光... 查看详情

OpenGL:移动相机时如何使光线静止?

】OpenGL:移动相机时如何使光线静止?【英文标题】:OpenGL:Howtomakelightstationarywhenmovingthecameraaround?【发布时间】:2016-12-1819:09:26【问题描述】:我正在尝试使用C语言编写的OpenGL和GLUT渲染一个简单(10x3x10大小)的房间。我想创建... 查看详情

显卡光线追踪是什么?怎么判断性能高低?

​光线追踪到底是什么?自从NVIDIA图灵架构的RTX20系显卡发布之后,我们就经常能听到“光线追踪”这个词。简单来说,这是一种在场景中渲染光线和阴影的先进而逼真的方法,在三维图形工作中早已经运用,... 查看详情