0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于光线追踪的渲染算法实现

颖脉Imgtec 2024-10-30 08:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文翻译自Scratchapixel 3.0[1],是一个关于计算机图形学的系统性的学习教程。如果有误,欢迎在评论区讨论。

我们已经涵盖了所有需要说的内容!我们现在准备写我们的第一个光线追踪器。你现在应该能够猜到光线追踪算法是如何工作的了。

首先,注意到自然界中光的传播只是从光源发出无数条射线,反弹直到它们撞到我们眼睛的表面。因此,光线追踪是优雅的,因为它直接基于我们周围发生的事情。除了它按照相反的顺序跟随光线的路径外,它是一个完美的自然模拟器。光线追踪算法使用由像素组成的图像。对于图片中的每个像素,它向场景中发射一个主射线。该主射线的方向是通过从眼睛到该像素中心的线追踪得到的。一旦我们设置了该主射线的方向,我们检查场景中的每个对象,看它们是否与任何对象相交。在某些情况下,主射线将与多个对象相交。当这种情况发生时,我们选择离眼睛最近的交点所在的对象。然后,我们从交点向光源发射一个阴影射线(图 1)。

d996eb9c-9652-11ef-8084-92fbcf53809c.gif

图1:我们通过像素中心发射一个主射线来检查可能的对象相交。当我们找到一个对象时,我们发射一个阴影射线来确定该点是否被照亮或在阴影中。

如果这条射线在到达光源的路上没有与其他对象相交,那么击中点就被照亮了。如果它与另一个对象相交,那个对象就会对它产生阴影(图 2)。

d9a78a42-9652-11ef-8084-92fbcf53809c.gif

图2:小球在大球上投下了阴影。阴影射线在到达光源之前与小球相交。

如果我们对每个像素重复这个操作,我们就可以得到我们三维场景的二维表示(图 3)。

d9c00680-9652-11ef-8084-92fbcf53809c.gif

图3:为了渲染一个帧,我们为每个帧缓冲区的像素发射一个主射线。

以下是算法的伪代码实现:

for (int j = 0; j < imageHeight; ++j) { for (int i = 0; i < imageWidth; ++i) { // compute primary ray direction Ray primRay; computePrimRay(i, j, &primRay); // shoot prim ray in the scene and search for the intersection Point pHit; Normal nHit; float minDist = INFINITY; Object object = NULL; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], primRay, &pHit, &nHit)) { float distance = Distance(eyePosition, pHit); if (distance < minDistance) { object = objects[k]; minDistance = distance; //update min distance } } } if (object != NULL) { // compute illumination Ray shadowRay; shadowRay.direction = lightPosition - pHit; bool isShadow = false; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], shadowRay)) { isInShadow = true; break; } } } if (!isInShadow) pixels[i][j] = object->color * light.brightness; else pixels[i][j] = 0; }}

正如我们所看到的,光线追踪的美妙之处在于它只需要几行代码;一个基本的光线追踪器只需要 200 行代码。与其他算法(如扫描线渲染器)不同,光线追踪的实现需要很少的努力。Arthur Appel 在 1969 年的一篇名为“一些用于给固体着色的机器渲染技术”的论文中首次描述了这种技术。那么,如果这个算法如此出色,为什么它没有取代所有其他渲染算法呢?主要原因在于速度,当时(甚至今天在某种程度上)是这样的。正如 Appel 在他的论文中所提到的:

“这种方法非常耗时,通常需要比线框图绘制多几千倍的计算时间才能获得有益的结果。其中约有一半时间用于确定投影和场景之间的点对点对应关系。”

换句话说,它很慢(正如 Kajiya 所说的,他是所有计算机图形学历史上最有影响力的研究人员之一:“光线追踪不慢,计算机慢”)。查找光线和几何图形之间的交点非常耗时。几十年来,算法的速度一直是光线追踪的主要缺点。然而,随着计算机变得更快,它越来越不是问题。尽管仍有一件事必须说:与其他技术(如 z 缓冲算法)相比,光线追踪仍然要慢得多。然而,随着今天的快速计算机,我们可以在几分钟内计算出以前需要一个小时才能完成的帧。实时和交互式光线追踪器是一个热门话题。

总之,重要的是要记住,渲染例程可以被认为是两个单独的过程。一步确定一个物体表面上的点是否从特定的像素可见(可见性部分),第二步着色该点(着色部分)。不幸的是,这两个步骤都需要昂贵和耗时的光线-几何交点测试。这个算法是优雅而强大的,但是它迫使我们在渲染时间和精度之间进行权衡。自 Appel 发表论文以来,已经进行了大量研究来加速光线-物体交点例程。随着计算机变得更加强大并结合这些加速技术,光线追踪成为了日常生产环境中可用的方法,并且是大多数渲染离线软件所使用的事实标准。视频游戏引擎仍在使用光栅化算法。然而,随着 GPU 加速光线追踪技术(2017-2018)和 RTX 技术的最近出现,实时光线追踪也在可及范围内。虽然一些视频游戏已经提供了可以打开光线追踪的模式,但仅限于简单的效果,如清晰的反射和阴影。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 光源
    +关注

    关注

    3

    文章

    779

    浏览量

    71097
  • 追踪器
    +关注

    关注

    0

    文章

    175

    浏览量

    26585
  • 光线追踪
    +关注

    关注

    0

    文章

    185

    浏览量

    22043
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SM4算法实现分享(一)算法原理

    ,Xi、Yi、rki为字,i=0,1,2,…,31。则本算法的加密实现为: 本算法的解密实现与加密实现结构是相同的,不同的只是提供的轮
    发表于 10-30 08:10

    目标追踪的简易实现:模板匹配

    重新出现在帧图象中时,迅速地重新捕捉到目标。 以上对目标追踪这一领域做了简要的说明,下面将会介绍目标追踪算法中最简单的一种 —— 模板匹配算法。 三、模板匹配
    发表于 10-28 07:21

    详解ROMA中复杂图表的渲染实现

    一、背景 ROMA承接很多复杂图表的渲染需求,在京东金融APP内,特别是首页首屏的图表,对图表渲染的及时性要求很高。近期业务反馈频繁重启时,首页的黄金走势图偶现渲染不出的问题,通过梳理图表的
    的头像 发表于 10-21 13:57 249次阅读
    详解ROMA中复杂图表的<b class='flag-5'>渲染</b><b class='flag-5'>实现</b>

    知乎开源“智能预渲染框架” 几行代码实现鸿蒙应用页面“秒开”

    ,交互延迟等核心痛点,通过智能预测用户浏览目标进行提前渲染,只需几行代码即可显著提升复杂页面的加载性能,实现“页面秒开”的高效体验,为鸿蒙开发者带来开发效率和用户体验的双重飞跃。 随着鸿蒙生态快速发展,应用开发者难免会遇到一些性能问题
    的头像 发表于 08-29 14:32 463次阅读
    知乎开源“智能预<b class='flag-5'>渲染</b>框架” 几行代码<b class='flag-5'>实现</b>鸿蒙应用页面“秒开”

    如何使用树莓派与OpenCV实现面部和运动追踪的云台系统?

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与OpenCV实现面部和运动追踪的云台系统使用树莓派和OpenCV
    的头像 发表于 08-14 17:45 953次阅读
    如何使用树莓派与OpenCV<b class='flag-5'>实现</b>面部和运动<b class='flag-5'>追踪</b>的云台系统?

    如何使用树莓派+OpenCV实现姿态估计和面部特征点追踪

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与OpenCV实现面部和运动追踪的云台系统使用树莓派和OpenCV
    的头像 发表于 08-13 17:44 964次阅读
    如何使用树莓派+OpenCV<b class='flag-5'>实现</b>姿态估计和面部特征点<b class='flag-5'>追踪</b>?

    光线跳线怎么用

    光线跳线(光纤跳线)是用于连接光纤设备(如交换机、路由器、光模块、光纤收发器等)或实现光信号灵活分配的关键组件,其使用方法需结合具体场景和设备类型。以下是详细的使用指南: 一、光线跳线的基本组
    的头像 发表于 07-18 09:40 572次阅读

    基于FPGA实现FOC算法之PWM模块设计

    哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍
    的头像 发表于 07-17 15:21 3115次阅读
    基于FPGA<b class='flag-5'>实现</b>FOC<b class='flag-5'>算法</b>之PWM模块设计

    通道渲染:释放渲染的全部潜能!通道渲染的作用、类型、技巧

    在3D图形创作中,渲染通道(RenderPasses)是一项至关重要的技术,它通过将复杂的渲染图像拆分为多个图层,如阴影、光照、法线等,使艺术家能够在后期制作中更精准地控制和调整画面。我们常常惊叹于
    的头像 发表于 07-15 14:22 440次阅读
    通道<b class='flag-5'>渲染</b>:释放<b class='flag-5'>渲染</b>的全部潜能!通道<b class='flag-5'>渲染</b>的作用、类型、技巧

    基于FPGA的压缩算法加速实现

    本设计中,计划实现对文件的压缩及解压,同时优化压缩中所涉及的信号处理和计算密集型功能,实现对其的加速处理。本设计的最终目标是证明在充分并行化的硬件体系结构 FPGA 上实现算法时,可
    的头像 发表于 07-10 11:09 2071次阅读
    基于FPGA的压缩<b class='flag-5'>算法</b>加速<b class='flag-5'>实现</b>

    CPU渲染、GPU渲染、XPU渲染详细对比:哪个渲染最快,哪个效果最好?

    动画渲染动画3D渲染技术需要应对复杂的计算任务和精细的图像处理,作为渲染技术人员,选择合适的渲染模式,会直接影响制作效率和成品质量。在主流的渲染
    的头像 发表于 04-15 09:28 1194次阅读
    CPU<b class='flag-5'>渲染</b>、GPU<b class='flag-5'>渲染</b>、XPU<b class='flag-5'>渲染</b>详细对比:哪个<b class='flag-5'>渲染</b>最快,哪个效果最好?

    2D图形渲染缓慢怎么加快?

    我有一个图形应用程序,它似乎渲染屏幕的速度很慢。按下屏幕后,通常需要相当长的时间来更新,大约 50 或 100 毫秒。 在应用程序启动时,我看到一条错误消息“GDK 无法创建 GL 上下文,回退
    发表于 04-02 06:46

    光线追踪及降噪技术综述

    过程传递3D场景的结果。渲染主要包括光栅化(rasterization)[5]和光线追踪[6]两种方式。光栅化渲染采用局部光照原理,根据光源照射到物体上直接可见的
    的头像 发表于 04-01 11:31 783次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b>及降噪技术综述

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研
    发表于 02-26 15:24

    GPU渲染才是大势所趋?CPU渲染与GPU渲染的现状与未来

    在3D建模和渲染领域,随着技术的发展,CPU渲染和GPU渲染这两种方法逐渐呈现出各自独特的优势,并且在不同的应用场景中各有侧重。尽管当前我们处在一个CPU渲染和GPU
    的头像 发表于 02-06 11:04 1230次阅读
    GPU<b class='flag-5'>渲染</b>才是大势所趋?CPU<b class='flag-5'>渲染</b>与GPU<b class='flag-5'>渲染</b>的现状与未来