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

    文章

    697

    浏览量

    67750
  • 追踪器
    +关注

    关注

    0

    文章

    169

    浏览量

    25687
  • 光线追踪
    +关注

    关注

    0

    文章

    183

    浏览量

    21467
收藏 人收藏

    评论

    相关推荐

    基于光线追踪实现反射折射效果

    本文翻译自Scratchapixel3.0[1],是一个关于计算机图形学的系统性的学习教程。如果有误,欢迎在评论区讨论。光线追踪的另一个优点是,通过扩展光线传播的思想,我们可以非常容易地「模拟反射
    的头像 发表于 11-09 01:07 156次阅读
    基于<b class='flag-5'>光线</b><b class='flag-5'>追踪</b><b class='flag-5'>实现</b>反射折射效果

    光线追踪算法概览

    本文翻译自Scratchapixel3.0[1],是一个关于计算机图形学的系统性的学习教程。如果有误,欢迎在评论区讨论。由伊本·海塔姆描述的现象解释了我们看到物体的原因。基于他的观察,可以得出两点有趣的评论:首先,没有光,我们什么也看不见;其次,如果我们环境中没有物体,我们也看不到光。如果我们在星际空间旅行,这通常就会发生。如果我们周围没有物质,我们只能看到
    的头像 发表于 10-12 08:07 144次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b><b class='flag-5'>算法</b>概览

    光线追踪的工作原理

    本文翻译自Scratchapixel3.0[1],是一个关于计算机图形学的系统性的学习教程。如果有误,欢迎在评论区讨论。注:本课程更多地是关于3D渲染的一般介绍。如果您有兴趣了解射线跟踪技术,请查看
    的头像 发表于 09-30 08:05 185次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b>的工作原理

    AMD光线追踪专家加盟高通,共筑Adreno GPU性能新高度

    在科技行业日新月异的今天,顶尖人才的流动往往预示着技术创新与突破的新篇章。近日,一则令人瞩目的消息在半导体与图形处理领域引起了广泛关注——AMD前光线追踪技术领域的杰出专家Paritosh
    的头像 发表于 07-11 10:03 558次阅读

    解码AI驱动的DLSS 3.5光线重建功能

    神经网络渲染器提高了光线追踪图像质量,使用可在采样光线之间生成更高质量像素的 AI 网络取代需要人工设计的降噪器。
    的头像 发表于 05-11 11:06 498次阅读
    解码AI驱动的DLSS 3.5<b class='flag-5'>光线</b>重建功能

    HarmonyOS实战开发-合理选择条件渲染和显隐控制

    开发者可以通过条件渲染或显隐控制两种方式来实现组件在显示和隐藏间的切换。本文从两者原理机制的区别出发,对二者适用场景分别进行说明,实现相应适用场景的示例并给出性能对比数据。 原理机制 条件渲染
    发表于 05-10 15:16

    MediaTek携手望尘科技通过移动端光线追踪技术打造沉浸体育游戏体验

    MediaTek携手望尘科技(GALA Sports),在手游领域实现光线追踪技术的革命性应用。该技术现已成功融入望尘科技旗下的钓鱼与篮球体育游戏中,极大地提升了玩家的视觉沉浸体验,让游戏画面更加逼真。
    的头像 发表于 05-07 11:39 673次阅读

    【RTC程序设计:实时音视频权威指南】视频采集与渲染

    领域,现在也有一些新技术,例如,光线追踪等等,都可以给计算机带来更高的渲染质量和视觉效果。在进行跨平台渲染时,需要用到OpenGL,着色器编程是OpenGL中一个重要的组成部分,通过编
    发表于 04-25 08:40

    MediaTek携手望尘科技共同推进移动端光线追踪技术在手游中的应用落地

    MediaTek 与望尘科技(GALA Sports)携手合作,共同推进移动端光线追踪技术在手游中的应用落地,将该技术成功导入了望尘科技旗下的钓鱼和篮球体育在线类游戏,为玩家带来更具沉浸感的逼真游戏画面。
    的头像 发表于 04-18 10:04 376次阅读
    MediaTek携手望尘科技共同推进移动端<b class='flag-5'>光线</b><b class='flag-5'>追踪</b>技术在手游中的应用落地

    AMD Radeon RX 7000M系列显卡特性分析

    AMD RDNA 3架构 – 新的计算单元在渲染、AI和光线追踪之间共享资源,以更有效地利用每个晶体管,实现快速又高效的性能。
    发表于 04-15 11:31 498次阅读
    AMD Radeon RX 7000M系列显卡特性分析

    微软:SSD固态硬盘可降低显存占用,提高光线追踪性能

    其专利说明如下:由于光线追踪加速结构常需占用其他数据存储空间(如几何图形和纹理数据),导致系统需大增内存负担,且所需带宽大。本文方法旨在缓解这一问题。
    的头像 发表于 03-25 15:46 533次阅读

    OpenHarmony Sheet 表格渲染引擎

    基于 Canvas 实现的高性能 Excel 表格引擎组件 [OpenHarmonySheet]。 由于大部分前端项目渲染层是使用框架根据排版模型树结构逐层渲染的,整棵渲染树也是与排版
    发表于 01-05 16:32

    揭秘:实时渲染、离线渲染、云渲染和混合渲染的区别

    渲染,就是将3D模型转换成2D图像,并最终呈现在屏幕上的过程。常见的渲染类型有以下几种:实时渲染离线渲染渲染混合
    的头像 发表于 12-26 08:27 778次阅读
    揭秘:实时<b class='flag-5'>渲染</b>、离线<b class='flag-5'>渲染</b>、云<b class='flag-5'>渲染</b>和混合<b class='flag-5'>渲染</b>的区别

    图形渲染的技术和原理:探索视觉效果的奇妙世界

    图形渲染是计算机图形学领域的核心技术之一,它通过将三维模型转化为二维图像,实现了各种视觉效果的呈现。无论是电影特效、视频游戏还是虚拟现实,都离不开图形渲染的应用。在图形渲染中,光栅化、
    的头像 发表于 12-13 08:28 869次阅读
    图形<b class='flag-5'>渲染</b>的技术和原理:探索视觉效果的奇妙世界

    追踪器arduino原理

    追踪器 (LDR) 是一种基于光敏电阻的光测量器件,常用于测量光强度和控制感应器。在 Arduino 上使用 LDR,可以实现光线进行检测、测量和控制的功能。本文将详细介绍 LDR
    的头像 发表于 12-08 10:22 1436次阅读