问题

如何阅读PBRT3?

回答
要深入理解 PBRT v3,就像踏上一段探索光影奥秘的旅程。它不是一份枯燥的参考手册,而是一本关于如何构建逼真渲染器的“武功秘籍”,每一章都像是在教授一种新的绘画技法,只不过这里的画笔是光线,画布是三维世界。

初学者不妨从“第一章:引言”开始,它会为你铺就一块坚实的理论基石。这里介绍的渲染的基本概念,比如光线追踪的原理,你就可以想象成我们小时候玩过的“透镜聚焦阳光”的游戏,只不过这里我们反过来,从观察者的眼睛出发,追踪每一束射入的光线。接着,会讲到渲染方程,这简直是PBRT v3的“心法总纲”,它描述了光线在一个场景中如何传播、反射、折射,最终到达我们的眼睛。要理解它,不妨想象一下,在你房间里,一盏灯的光,照亮了墙壁,又反射到桌子上,再被你的眼睛捕捉到。渲染方程就是把这个过程数学化,量化每一个“照亮”和“反射”的能量。

然后,你可以翻到关于“相机”和“表面”的章节。相机就像我们的眼睛,它决定了我们看到什么,以及如何去看。PBRT v3会详细介绍各种相机模型,从简单的针孔相机到更复杂的透视相机,甚至还有模拟电影摄影机的景深效果。而表面,则是我们眼中看到的一切的“皮肤”。PBRT v3会深入讲解不同材质的特性,比如光滑的金属会反射清晰的影像,粗糙的木头则会漫反射光线,产生柔和的效果。这部分你可以想象成给三维模型穿上不同的“衣服”,从丝绸到皮革,每一种材质都有其独特的“纹理”和“光泽”。

接下来的章节,比如“光照”和“采样”,才是真正让PBRT v3“活”起来的部分。光照不再是你按下“开灯”按钮那么简单,它是一个复杂的光源系统,从点光源到区域光源,甚至还有模拟太阳和天空的复杂光源。你需要理解这些光源是如何产生光线,以及这些光线如何与场景中的物体互动。采样则是一个更精妙的技巧,因为我们不可能追踪无限多的光线,所以PBRT v3会教你如何“聪明”地选择光线,以较低的成本获得高质量的渲染效果。你可以把它想象成画家在画布上点睛之笔,通过有限的笔触,却能勾勒出栩栩如生的画面。

如果你想挑战更深层次的“内功”,可以深入学习“体积渲染”和“全局光照”等章节。体积渲染就像是模拟烟雾、薄雾或云层,光线在这些介质中会发生散射和吸收,产生一种朦胧的美感。而全局光照,则是PBRT v3最强大的武器之一,它能模拟那些间接的光照效果,比如墙壁反射的光线照亮房间的角落,或者一个红色的物体反射出的红色光晕。这部分就像是让你掌握了“点石成金”的秘术,能够让原本黑暗的角落也充满生机。

阅读PBRT v3,最重要的一点是,不要害怕那些复杂的数学公式。这些公式是理解底层原理的关键,但更重要的是,理解它们所代表的物理意义。可以尝试着自己去实现书中的一些算法,或者使用PBRT v3自带的工具来运行一些示例场景,亲眼看到那些理论是如何转化为逼真的图像的。这个过程就像学武之人,不仅要研读兵法,更要亲自操练,才能真正领悟其中的精髓。

总之,PBRT v3的学习过程,是一场理论与实践相结合的探索。它需要耐心、毅力和对光影世界的好奇心。当你能够熟练运用它,你就能用代码创造出任何你想象得到的视觉效果,就像一位技艺精湛的魔术师,用光影在屏幕上变幻出无穷的奇迹。

网友意见

user avatar

我以前因为对真实感渲染的好奇去读 PBRT,书里依次介绍了 Shape、Camera、Sampler、BSDF、Light、Integrator……我一直看不明白,费了很大力气去读,才发觉这整本书写的都是蒙特卡洛光线追踪 Monte Carlo RayTracing,这和 smalllpt 本质上是一样的。去年偶然想到可以把 smallpt 一步步的改写成 pbrt,在这个过程中介绍蒙特卡洛光线追踪和 pbrt 的架构,用了几个月(基本)完成了:

可以把它当作是阅读 pbrt 的前菜,先熟悉相同结构下这个 smallpbrt 的工作流程,再去看 pbrt 应该会清晰一点。

文章用了别的标记语言来写,只能用 html 格式导出,这里贴一些片段:

smallpt[1] 是一个仅有 99 行的迷你光线追踪渲染器,在极小的体积下实现了图元、材质、光源、场景、相机、采样器、积分器等模块,可以说麻雀虽小五脏俱全。关于 smallpt 是如何实现这些功能的,网络上已经有些很好的介绍[2][3][4]。

pbrt[5] 既是一个多功能光线追踪渲染器的名字,也是对应书籍的简称[6],书中以文学编程 Literate Programming 的方式,介绍了这个读者如果能看懂就看得懂,看不懂就看不懂的渲染器。pbrt 具有一个相当优秀的架构,给很多渲染器带来了启发[7][8][9]。下文中提到的 pbrt 指渲染器,PBRT 指书籍。

smallpt 和 pbrt 虽然体量和功能差异巨大,但在笔者眼里却有着一样的核心功能:蒙特卡洛光线追踪(Monte Carlo Ray Tracing),这就像王垠说的:

很多人都不知道,有一天我用不到一百行 Scheme 代码就写出了一个「深度学习框架」,它其实是一个小的编程语言。虽然没有性能可言,没有 GPU 加速,功能也不完善,但它抓住了 PyTorch 等大型框架的本质——用这个语言写出来的函数能自动求导。这种洞察力才是最关键的东西,只要抓住了关键,细节都可以在需要的时候琢磨出来。几十行代码反复琢磨,往往能帮助你看透上百万行的项目里隐藏的秘密。
如何阅读别人的代码 yinwang.org/blog-cn/202

通过阅读一个小规模的软件,来了解这一类型软件的架构模式是很常见的做法[10]。但 smallpt 为了控制体积实在太简略了一点,导致它的结构并没有那么清晰,想从 smallpt 里看出 pbrt 的架构并不容易,而且它那 99 行的代码里还涉及了大量的理论技术。

本文将基于 pbrt 的架构一步步改写 smallpt,通过每一步的实际代码去解释蒙特卡洛光线追踪和 pbrt 的大致架构,方便对光线追踪、全局光照感兴趣的同学了解学习。

……

改写 smallpt

这一步会把 smallpt 改写成 pbrt,在改写之前先来介绍下 pbrt。

pbrt 的主要功能是根据输入的描述文件创建出场景,并根据相机的参数渲染出对应图像,它的整个工作过程如下:

  • SamplerIntegraotr:通过(蒙特卡洛方法)采样,来求解渲染方程(一个积分方程的)的积分器,也可以把它当做通常的渲染器 Renderer 看待。
  • SamplerIntegraotr::Render(): SamplerIntegraotr 的基类是抽象类 Integrator,它只有 Integraotr::Render() 这一个接口,pbrt 在创建完场景和积分器后,就会调用积分器开始渲染场景。每种积分器实现会用自己的方式去渲染场景。
  • 对于 SamplerIntegraotr::Render() 来说,它也会遍历图像平面 Film,通过采样器 Sampler 在图像的每个像素上生成相机要用的采样点 CameraSample ,然后传递给相机 Camera 生成光线 Ray ,寻找光线到场景 Scene 中的最近交点 Intersection ,在交点上计算半球积分,返回沿光线方向辐射出的亮度……与 smallpt 的主函数 main() 如出一辙。
  • SamplerIntegraotr::Li(): SamplerIntegraotr 的核心方法是 Li(ray, scene, sampler, depth),对应 smallpt 中的 Radiance(ray, sampler, dpeth) (smallpt 的场景是全局的,不用传进来)。在 Li(ray, scene, sampler, depth) 中会同时采样 BRDF 和光源,关于要如何采样光源,会放到额外拓展的部分介绍。

这就是 pbrt 的整体架构,也是 pbrt 的核心功能:求解渲染方程。(smallpt:我也是)

是不是对上了。

对于上面描述的这些概念,pbrt 都有对应的抽象类(接口类)来实现:

并且通过这组抽象类之间的交互(上面的箭头)来完成功能。每个抽象类都会有多种实现,比如对于材质 Material,就可以有哑光材质 MatteMaterial(通过完全漫反射 BRDF LambertenReflection 实现);镜面材质 MirrorMaterial(通过完全镜面反射 BRDF SpecularReflection 实现)。这些实现类基本放在 core/ 之外的其它文件夹下。

除此之外 pbrt 还实现了大量别的功能:并行/内存分配/统计/调试/场景解析等一系列功能,于是它的代码行数就来到了几万行(没统计过,大概是这个量级)。

99 行 vs 几万行,这两个数量级要怎么跨过呢?

给 smallpt 加功能是不可能的,假如只保留 pbrt 的核心功能,去掉那些实现类和其它功能呢?

  • 不需要那么多种几何形状,球体 Sphere 就够了:去掉 shape/ 目录
  • 不需要那么多种相机,透视相机 PerspectiveCamera 就够了:去掉 camera/ 目录
  • 不需要那么多种采样器,最基本的随机采样器 RandomSampler 就够了:去掉 sampler/ 目录
  • ……

至于场景中的空间加速结构 Aggregate,图像平面的滤波器 Filter,提供材质细节的纹理 Texture,实现体积渲染的介质 Medium 等,连抽象类都可以去掉。

到这里就只剩下了 core/ 这个目录,把它的代码整合一下,再去掉并行等一系列没了也能跑的功能,给每个抽象类(Shape,Sampler,Camera,BSDF/BxDF,Light,Integrator……)加上最简单的实现,我们就得到了一千行左右的 smallpt_rewrite.cpp。(也可以管它叫 smallpbrt.cpp )

如果在这个基础上再做精简的话:

  • 类结构也不要了:smallpt_comment.cpp (因此在 samllpt 里看不到 Sampler,Camera 这些类,但功能还在 )
  • 代码级别的结构和变量命名也不要了:smallpt_format.cpp (这个 Radiance(...) 的实现都是 tirck 吧)
  • 再压缩一下行数:smallpt.cpp
  • 把带有菲涅尔反射的材质也去掉:nanopt.cpp
  • 收手吧

在前几节,我们已经从 smallpt.cpp 反向实现了 smallpt_format.cpp 和 smallpt_comment.cpp ,接下来将把 300 行的 smallpt_comment.cpp 结构化为 1300 行的 smallpt_rewrite.cpp / smallpbrt.cpp ,这就有了本文的标题。

smallpt_rewrite.cpp 的提交记录比较干净,感兴趣的同学可以直接看每次提交都结构化了什么功能。

……

结语

回想起以前刚学渲染的时候,既看不懂公式,也看不懂代码,只能看着那些漂亮的渲染图发愣,那种被挡在外面的感觉真是太痛苦了,因此想尽自己的一点努力给感兴趣的同学铺点基础,虽然还有很多细节没有提到,但笔者认为本文已经把蒙特卡洛光线追踪的基础框架搭起来了,剩下的知识都可以逐个去了解,希望这可以在图形渲染的路上助大家一臂之力。

祝收敛!

类似的话题

  • 回答
    要深入理解 PBRT v3,就像踏上一段探索光影奥秘的旅程。它不是一份枯燥的参考手册,而是一本关于如何构建逼真渲染器的“武功秘籍”,每一章都像是在教授一种新的绘画技法,只不过这里的画笔是光线,画布是三维世界。初学者不妨从“第一章:引言”开始,它会为你铺就一块坚实的理论基石。这里介绍的渲染的基本概念,.............
  • 回答
    阅读历史书是一项既能拓展知识、又能锻炼批判性思维的活动。要真正从历史书中获益,你需要掌握一些阅读技巧,而不仅仅是机械地翻页。以下是一份详细的指南,教你如何有效地阅读历史书: 一、 阅读前的准备:知己知彼,百战不殆在翻开历史书的第一页之前,做一些准备工作可以让你事半功倍。 1. 明确你的阅读目的: 是.............
  • 回答
    读《二十四史》,可不是件简单事,它就像一部中国古代的历史长卷,想要从中窥见端倪,需要点耐心和方法。别把它当成流水账,里面学问深着呢。咱们这就细细道来,让你知道该怎么下手。一、 明白它是什么,以及为什么要读它首先得知道,《二十四史》不是一本,而是二十四部纪传体史书的总称。从《史记》开始,一直到《清史稿.............
  • 回答
    要深入理解马克思的《路易·波拿巴的雾月十八日》,与其说“阅读”,不如说是“进入”一个充满历史现场感和思想张力的世界。这本书不是那种可以轻松翻阅的读物,它需要你投入时间和精力,去拆解、去联系,去感受马克思笔下那个充满荒诞与深刻的历史画卷。一、 建立背景:戴上“历史滤镜”在动笔之前,你需要先给自己“补课.............
  • 回答
    读英文原版书,这事儿说起来是个循序渐进的过程,不是一口就能吃个胖子,但一旦入了门,那滋味可就妙不可言了。我这人吧,总觉得原汁原味的东西最好,就像品茶一样,翻译过来的总少了点那股劲儿。所以,我捣鼓出了一套自己的方法,一路跌跌撞撞走来,也算有点心得。首先,选对书,比啥都重要。别想着一上来就啃莎士比亚或者.............
  • 回答
    好的,我们来聊聊如何啃下 Hatcher 的《代数拓扑》(Algebraic Topology)这本书。这本书确实是代数拓扑领域的经典之作,但也以其严谨和深度著称,对于初学者来说,它确实是一座不小的山峰。但别担心,只要方法得当,你会发现这座山峰上风景无限。在我看来,阅读 Hatcher 的代数拓扑,.............
  • 回答
    好的,咱们来聊聊怎么啃《冰与火之歌》这套大部头英文原版。这事儿吧,不是那种“读一本,秒懂”的事儿,得有点耐心,有点方法。我尽量说得细致点,就像咱们自己人在一块儿分享经验一样。为啥要读英文原版?这事儿不用多说,大家都明白。翻译嘛,总会有味道上的损失。原版就像吃新鲜的食材,你品尝的是作者最初的调味。而且.............
  • 回答
    阅读一家上市公司的年报,与其说是“阅读”,不如说是进行一次深入的“探险”。这本厚厚的报告,是公司过去一年里所有努力、成就、挑战以及未来规划的集大成者,如同一个详尽的人生自传。如何才能从这堆数字和文字中挖掘出有价值的信息,就像寻宝一样,需要一些技巧和耐心。首先,别被那些密密麻麻的数字吓倒。年报里最重要.............
  • 回答
    古代文献,那玩意儿可不是随便翻翻就能读懂的,它跟咱们平时看的网络小说、公众号文章那可不是一码事儿,甚至跟现在咱们读的学术论文,也有着天壤之别。读古代文献,更像是在跟一位来自千年之前的故人对话,需要耐心、细致,还得揣摩他话里的门道。怎么个读法?那得看你读的是什么,目标又是什么。1. 首先,得认识你的“.............
  • 回答
    哈,读《三国志》?这可是个好选择,不过你觉得没头绪,我完全理解。这本书不像那种情节跌宕起伏、让你一口气读完的小说。它更像是历史学家留下的一份非常详实的报告,充满了人物、事件、时间,而且风格比较古朴。没头绪是很正常的,我当初刚开始读的时候,也是一头雾水。不过别担心,咱这就把这事儿掰开了揉碎了说,让你也.............
  • 回答
    研究生阶段的文献阅读,可不是本科时翻翻教材、看看中文摘要那么简单。它更像是在一个宏大的知识体系中,自己动手去挖掘、去构建。这门功课,说实话,很多人一开始是摸不着门道的,甚至有些痛苦。但一旦掌握了方法,那种醍醐灌顶的感觉,也是极大的学术乐趣所在。咱们就从头到尾,聊聊这研究生文献阅读的“道”与“术”。一.............
  • 回答
    好,我知道了。让这篇文章听起来更像一个有经验的老师在跟学生分享心得,而不是一个冰冷的AI。我来帮你梳理一下,中学生该怎么“啃”那些听起来就很高大上的顶级期刊文献。首先,咱们得明白一个事儿,你现在是中学生,不是大学里的博士生。这意味着,你不可能指望像专业研究者一样,看完一篇文献就能把里面的所有细节都嚼.............
  • 回答
    日本人在阅读古汉语时,采用了一种独特而精妙的方式,融合了本土的语言习惯、历史积淀以及对汉文化的尊重。这不像我们想象中那样,是直接照搬现代汉语的读法,而是经过了层层转化和适应。首先,要理解日本人如何阅读古汉语,就必须先了解“汉文训读法”(かんぶんくんよみ)。这可以说是日本人阅读古汉语的灵魂所在。汉文训.............
  • 回答
    交易员每天沉浸在海量信息洪流中,这绝非易事。他们就像是信息大海里的舵手,需要精准地把握方向,快速辨别浪潮的本质,而不是被巨浪吞噬。要做到这一点,他们依赖一套系统性的方法,结合了技术、策略和多年磨练的直觉。1. 精准的“信息过滤网”:只抓最关键的首先,你需要理解,交易员不是什么都看。他们拥有一套高度个.............
  • 回答
    一张好的历史地图,就像一扇开启过去时光的窗口,它不仅仅是线条和色彩的堆砌,更是那个时代风貌、社会结构、甚至人们思维方式的凝结。要说好的历史地图,我脑海中浮现的,更多是那些能够引人入胜,让人仿佛置身其中的地图。比如,我们聊聊那些描绘古代丝绸之路的地图。它们通常不是简单标注出一条线,而是会精心绘制沿途的.............
  • 回答
    作为一名三国爱好者,我对《三国志》和《三国演义》的阅读方式,可以说是又爱又恨,又敬又玩。这两种文本,一个是史书的严谨,一个是小说的精彩,它们在我心中的地位,就像是关羽的青龙偃月刀和诸葛亮的羽扇,缺一不可,相辅相成。一、《三国志》:历史的基石,考据的乐趣我阅读《三国志》的初衷,其实是想弄清楚《三国演义.............
  • 回答
    没有导师的指导,研究生要想在文献阅读、提出创见和撰写论文这几项关键的研究活动上取得进展,确实需要付出更多的主动性和系统性的努力。这就像是在一片陌生的森林里独自探险,你不仅要找到路,还要能认识并利用这里的资源。下面我将从这三个方面,尽可能详尽地为你拆解每一步该如何去做,尽量让你感受到这是一位过来人,或.............
  • 回答
    好的,咱们来聊聊怎么啃那些写得好溜的开源框架的源码。这不是件容易事,得有耐心,也得有章法。我尽量把我的经验都掏出来,希望能帮你少走些弯路。一、 知己知彼:心态准备与目标设定在开始之前,先把心态放平,别想着一口吃个胖子。啃源码是个循序渐进的过程,不是看一遍就能全懂。 摆正心态: 你不是去“找错误”.............
  • 回答
    在阅读英文原版书的同时学习语法和生词,这绝对是一条高效又有趣的进阶之路!抛开那些枯燥的语法书和背不完的单词表吧,让阅读本身成为你最好的老师。下面就来聊聊,怎么把这个过程做得既扎实又不会让你觉得像是在“上课”。核心理念:沉浸式学习与主动探索的结合别想着一次性把书里的每个词、每句话都抠个底朝天。那样很容.............
  • 回答
    想要通过阅读英文网站来提升英语水平,这绝对是个明智的选择!英文网站信息量巨大,覆盖面广,而且更新速度快,简直就是一座取之不尽的宝藏。关键在于怎么去“挖”,怎么把这些信息转化为你自己的能力。咱们一步步来聊,保证说得够细致,让你觉得这就是一个过来人掏心窝子分享的经验。第一步:找到适合你的“乐园”——选对.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有