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

    文章

    813

    浏览量

    71492
  • 追踪器
    +关注

    关注

    0

    文章

    179

    浏览量

    26699
  • 光线追踪
    +关注

    关注

    0

    文章

    186

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    行业洞察篇__财务数字孪生的渲染选择:端渲染与流渲染的协同演进逻辑

    实现极低延迟的操控;而超大规模、低频交互的宏观态势场景(比如集团全局资产地图、跨区域资金流向图)适合流渲染,把海量计算放在服务器端,终端只用接收视频流,大幅降低硬件门槛。这种分层逻辑听起来简单,但工程
    发表于 05-22 11:02

    渲染与流渲染的分化与融合:数字孪生开发套件的工程选型逻辑

    圈”的等待。我见过一个典型的案例:某园区想实现应急指挥时,管理者在大屏前指挥、巡检员用手机配合,结果因为选用了纯端渲染方案,手机端场景加载需要几十秒,等画面出来,泵站已经溢流了。这种撕裂感并非技术本身
    发表于 05-22 10:39

    技术选型之道|端渲染与流渲染融合:数字孪生应用落地的理性路径

    一个尴尬的现实:单一渲染路线就像只有一把锤子,看什么都像钉子。 我曾经观摩过一个项目招标,某方案声称用纯端渲染实现了全城级别的实时渲染,结果实际演示时,场景加载耗时惊人,一旦开启车辆轨
    发表于 05-22 10:23

    技术选型__数字孪生项目交付中端渲染与流渲染的协同策略

    维场景则希望快速上线、免运维。像孪易这种产品,其标准版支持公有云服务也支持私有化部署,这实际上是在为不同安全等级的项目提供灵活的底座。而图观的双引擎体系则通过场景打包与服务器组件,实现了端渲染场景
    发表于 05-22 10:20

    [FRED] FRED应用:背散射教程

    光线将全部内反射并将在前表面上停止除非光线追踪控制允许TIR。 如果您的操作正确的话,这就是光线追迹的渲染图,为增加对比度改变了一下颜色。
    发表于 05-20 08:21

    行业洞察篇__数字孪生IOC的“双引擎”时代:当端渲染遇见流渲染

    的平板电脑,去操作一个光线追踪、次表面散射效果全部拉满的超级城市模型,指挥中心的大屏效果确实达到了电影级水准。但等到真正部署进入业务阶段,问题就浮出了水面。我记得有一次在联合应急指挥演练中,多个部门同时
    发表于 05-14 09:50

    技术选型篇__数字孪生应用开发:端渲染与流渲染融合的工程适配与演进

    我们只能硬着头皮上两套系统,现在更多有远见的团队开始尝试用一个统一开发套件来承载这一切。我观察到的一种实现方式是,这类套件内置了一个“渲染模式切换器”,开发者在搭建场景时,只需要定义好模型的组件层级
    发表于 05-13 13:56

    NVIDIA DLSS 5发布并首次引入实时神经网络渲染模型

    NVIDIA 今天发布 NVIDIA DLSS 5,这是自 2018 年实时光线追踪首次亮相以来,NVIDIA 在计算机图形领域最重大的突破。
    的头像 发表于 03-19 15:33 460次阅读

    电子凸轮同步追踪的方案分析

    电子凸轮同步追踪技术作为工业自动化领域的核心控制策略,其本质是通过软件算法模拟机械凸轮的运动特性,实现多轴间的高精度相位同步。该技术突破了传统机械凸轮的物理限制,在包装机械、印刷设备、数控机床等场景中展现出显著优势。以下从技术原
    的头像 发表于 03-02 17:13 783次阅读

    BLE SoC,如何助力管理者实现高效的资产追踪

    基于BLE SoC的资产追踪方案,具备低功耗、高集成和生态成熟,实现高效资产定位与管理。
    的头像 发表于 12-22 14:16 502次阅读
    BLE SoC,如何助力管理者<b class='flag-5'>实现</b>高效的资产<b class='flag-5'>追踪</b>?

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

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

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

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

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

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

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

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

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

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