总结《Ray Tracing from the Ground Up》

来源:互联网 发布:公司logo在线制作软件 编辑:程序博客网 时间:2024/06/04 23:26

之前已经学习过《Ray Tracing in One Weekend》和《An Introduction to Ray Tracing》的一些内容,相关总结文档链接如下:
总结《Ray Tracing in One Weekend》
总结《An Introduction to Ray Tracing》

已经在《Ray Tracing in One Weekend》的源代码的基础上,拓展生成各种surface的图形。但是,这些图形中尚未添加合适的光照模型、反射模型、纹理等等。咱学习《Ray Tracing from the Ground Up》的主要目的是:给图形添加光照模型、反射模型和纹理。

《Ray Tracing from the Ground Up》的官网链接:http://www.raytracegroundup.com/

先说说,个人对这本书的看法:
1,这是本好书;
2,提供了较为完整的源代码;(整体代码的完整度并没有覆盖所有章节,后面几章的代码需要逐一手动porting到软件中。)
3,本书的源代码架构要显得比《Ray Tracing in One Weekend》“高级”点,毕竟《Ray Tracing in One Weekend》提供的简易入门版本。“简易”有简易的好处,不会一上来就是云里雾里的一大通理论,不会让读者在云里雾里找不到北。所以,个人《Ray Tracing in One Weekend》时入门的不二之选。
4,虽然,本书有详细的理论介绍,但是也不是很难懂。作者对理论的讲解深度应该算是恰到好处。不是想《Ray Tracing in One Weekend》那样简浅,也不是《Physically Based Rendering_From Theory To Implementation》那样深入。所以,这本书也算是比较好读的。
5,本书出版于2007年,内容基本覆盖当时Ray Tracing的各个方面。当然,按照作者自己的说法:受篇幅的限制,纹理部分有几处内容未包含进来。

咱读这本书的目的是光照模型、反射模型、纹理。所以,前文的其他内容会跳过,直接从反射模型开始(差不多是从第14章开始)。当然,在真正开始前,咱得将官网的源代码在本地跑起来。咱用的是Windows+Codeblocks。软件移植链接:
问题六十八: 着色模型(shading model)(0)——《Ray Tracing from the Ground Up》代码的移植

原文目录
1 Design and Programming
2 Some Essential Mathematics
3 Bare-Bones Ray Tracing
4 Antialiasing
5 Sampling Techniques
6 Mapping Samples to a Disk
7 Mapping Samples to a Hemisphere
8 Perspective Viewing
9 A Practical Viewing System
10 Depth of Field
11 Non-Linear Projections
12 Stereoscopy
13 Theoretical Foundations

14 Lights and Materials

学习“反射模型”时,主要参考了本书第13、14章节和《An Introduction to Ray Tracing》、《Real-Time Rendering》相关章节的内容。总结文档链接:
问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(1)——概述
问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.1)——漫反射(diffuse reflection)
问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(2.2)——高光反射(specular reflection)
问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(3.1)——辐射学(Radiometry)
问题六十八:BRDF——(着色模型(shading model)(1)——反射模型(reflection model)(3.2))
问题六十八:Phong反射模型的C++实现
问题六十八:着色模型(shading model)(2)——光照模型(Light model)
问题六十八:光照模型(Light model)——关于“环境光”模型的补充

反射模型中的高光部分其实用到第15章(Specular reflection)的内容。

16 Shadow

阴影的原理是:从撞击点向光源引一条阴影光线,若该光线在达到光源前有撞击到其他物体,说明原撞击点在阴影之中。

问题六十九:阴影(Shadow)——原理和C++实现

17 Ambient Occlusion

环境光遮蔽的实现原理:对撞击点处的上半球面进行采样获得采样点,连接采样点和撞击点得到阴影光线,若该阴影光线撞击到其他物体,则说明撞击点处的环境光被其他物体遮蔽。

所以,在实现“环境光遮蔽”之前,我们需要先学习“采样”。
问题七十:计算机图形中的采样(Sampling)

问题七十一:环境光遮蔽(Ambient Occlusion)

18 Area Lights

在实现面积光源之前,我们需要先回忆13.10.2章节渲染方程的面积形式和13.11章节的蒙特卡罗积分。
Q72:渲染方程(Rendering Equation)
Q73:蒙特•卡罗积分(Monte Carlo Integration)

Q74:面积光源(Area Light)

Q75:光照模型汇总:环境光、平行光光源、点光源、面积光源

19 Ray-Objects Intersections

这一章节的内容,咱在《An Introduction to Ray Tracing》已经基本详细学习过了。

20 Affine Transformations

Q76:仿射变换(Affine Transformation)

21 Transforming Objects

Q77:怎么用Ray Tracing画仿射变换之后的图形

22 Regular Grids

“规则网格”是Ray Tracing中的一种加速技术。
Q78:规则网格(Regular Grids)——Ray Tracing中的一种加速技术

23 Triangle Meshes

“三角形网格”是个好东西。还记得在学习《An Introduction to Ray Tracing》的过程中画有些surface时,那是解各种一元四次、一元六次、一元十次方程。现在利用“三角形网格”,只要知道曲面的参数方程,画出对应的曲面是分分钟的事情(夸张了点)。

Q79:怎么用三角形网格(Triangle Mesh)细分曲面
Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)

Q97:怎么用三角形网格细分Bezier曲面——以Utah Teapot为例
Q98:三角形网格细分Bezier曲面时,注意三角形顶点的顺序(确保其对应的法向量向外)

Q100:怎么用三角形网格细分回旋体(rotational sweeping / revolution)

“细分”曲面的体力活在程序中临时来干,是不是有点费劲。好了,所以就有了PLY文件,这种文件就是曲面细分后的数据。然后,在程序中读入PLY文件即可。

市面上有些比较流行的PLY格式的图形,比如:bunny、dragon等等。但是,咱在Windows环境下直接导入这些PLY文件数据时,会遇到一个问题。所以,我们需要:
Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行——怎么将Unix/Mac系统下的文件转换到Windows系统下

然后,就可以干正事啦。
Q81:“三角形网格”之“PLY文件”
Q82:三角形网格[Triangle Mesh]图形的平滑着色[Smooth Shading]
Q83:怎么画多个PLY文件组合的图形[Multiple-Mesh Objects]
Q84:层级实例网格[Hierarchical Instance Grids]

Q92:怎么对PLY文件对应的图形进行仿射变换

24 Mirror Reflection

前面咱用到的光照模型基本都是直接光照,即直接来自光源。至于间接光照,咱尚未涉及。比如,在镜中看到其他物体的像。这个像对应的物体并不是光源,为什么能被看到呢?
Q85:对比“直接光照”和“间接光照”的反射模型

本章的Mirror Reflection和下一章节的Glossy Reflection讲的都是间接光照。
Q86:镜面反射(Mirror Reflection)

25 Glossy Reflection

Q87:间接光照(Indirect Illumination)的高光反射(Glossy Reflcetion)

26 Global Illumination

在第24、25章节中,虽然已经涉及了间接光照。但是,这只是间接光照的两种特殊形式。还有其他非特殊情况的间接光照,咱尚未考虑。

这一章节涉及的Path Tracing技术,不分直接光照、间接光照,直接考虑所有光照(所有可能到达撞击点的光照)。这个可以算是基于物理的模型,而之前学过的模型只能算是基于经验的模型。
Q88:全局光照(Global Illumination)——Path Tracing
Q88:全局光照(Global Illumination)——Path Tracing算法生成反射焦散效果的图形

改进版:
Q89:全局光照(Global Illumination)——Path Tracing(只用于间接光照)

27 Simple Transparency

Q90:简易地模拟透明材质(Simple Transparency)

28 Realistic Transparency

Q91:真实地模拟透明材质(Realistic Transparency)

Q91:真实地模拟透明材质(Realistic Transparency)(2)——Triangle Meshes
Q93:PLY文件对应图形法向量反向问题——以bunny10K为例

Q94:怎么用ray tracing画部分圆环(Part Tori)
Q91:真实地模拟透明材质(Realistic Transparency)(3)——A Glass of Water
Q91:真实地模拟透明材质(Realistic Transparency)(4)——Fish Bowl

29 Texture Mapping

纹理分两大类:
1,映射纹理。本章节的内容,讲的是将外部图片映射到几何图形上。
2,过程纹理。过程纹理是根据撞击点的信息而在程序中计算得到的(而不是来自外部图片的映射)。过程纹理又分两类:

  • 2.1普通的过程纹理。第30章的内容。主要讲的时方格纹理。
  • 2.2基于噪声的过程纹理。第31章的内容。会讲到大理石纹理、砂岩纹理、木纹纹理。

Q95:纹理映射(Texture Mapping)——地球仪
Q95:纹理映射(Texture Mapping)(2)——圆柱面
Q95:纹理映射(Texture Mapping)(3)——Triangle Meshes

30 Procedural Textures

计算过程纹理时,会用到floor()函数。
C++中的floor()函数

Q96:过程纹理(Procedural Texture)(0)——概述
Q96:PT(1):方格纹理(Checker)(1)——3D Checker
Q96:PT(1):方格纹理(Checker)(2)——2D Checker
Q96:PT(1.2.2):球面2D方格纹理(Sphere 2D Checker)
Q96:PT(1.2.3):圆柱2D方格纹理(Cylinder 2D Checker)

另外,讲到纹理的仿射变换。
Q96:PT(2):纹理的仿射变换(Textures And Transformations)

31 Noise-Based Textures

Q96:PT(3):基于噪声的纹理(Noise-Based Textures)(0)——概述这里写链接内容
Q96:PT(3.1):基本的基于噪声的纹理(Basic Noise-Based Textures)
Q96:PT(3.2):包裹的基于噪声的纹理(Wrapped Noise-Based Textures)

Q96:PT(3.3):大理石纹理(Marble Texture)

Q96:PT(3.4):砂岩纹理(Sandstone Texture)

smoothstep(),平滑阶梯函数,平滑过渡函数
Q96:PT(3.5):木纹纹理(Wood Texture)

接着,咱trace了几个图形:
Q99:当Bezier曲面(Utah Teapot)同时遇上“噪声纹理”和“Phong反射模型”
Q101:真实地模拟一个玻璃酒杯(Wine Glass)(回旋曲面)

32 光线追踪场景

这一章节是咱自己加的。咱trace了几个场景。

Q102:光线追踪场景(1)——地球仪
Q102:光线追踪场景(2)——PLYs(多种模型汇集)
Q102:光线追踪场景(3)——Two Horses
Q102:光线追踪场景(4)——面朝大海
Q102:光线追踪场景(5)——驭龙台

阅读全文
2 0
原创粉丝点击