之前已经学习过《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)——驭龙台

总结《Ray Tracing from the Ground Up》相关推荐

  1. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  2. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

  3. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  4. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  5. STL源码剖析——P142关于list::sort函数

    在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...

  6. STL源码剖析---红黑树原理详解下

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584       算法导论书上给出的红黑树的性质如下,跟STL源码 ...

  7. STL源码剖析面试问题

    当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...

  8. STL源码剖析学习二:空间配置器(allocator)

    STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...

  9. STL源码剖析 数值算法 copy 算法

    copy复制操作,其操作通过使用assignment operator .针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove ...

  10. STL源码剖析 算法开篇

    STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...

最新文章

  1. 基于Python语言Hamcrest断言的使用
  2. [原]如何做一份精致的性能测试报告?
  3. Android开发之PCM音频流采集| 音频流录制与PCM音频流播放的实现方法
  4. Vue.js响应式原理
  5. 李迟2021年9月知识总结
  6. gcc及doxygen的安装过程
  7. 2 str转byte失败_android 4.2的多线程库加载崩溃问题
  8. android emoji unicode编码表,unicode编码
  9. HTML常用字体代码
  10. keras深度学习之猫狗分类一
  11. 《犯罪心理学》读书笔记(part10)--犯罪心理的性别差异(上)
  12. python中集合用什么符号表示_Python 集合set添加删除、交集、并集、集合操作符号...
  13. 3、男人长得丑,除了知识还需要些什么?
  14. [湖南大学程序设计实训训练作业一]7.F1方程式冠军(灵活运用下标来简化代码)
  15. android shell打包
  16. 干货 | 那些你不知道的爬虫反爬虫套路
  17. Python Excel的使用2
  18. 1、Multisim14 安装教程
  19. 如何为XenServer虚拟机linux系统安装XenServer Tools
  20. 各类牛B电影,暑假慢慢看完

热门文章

  1. 销售易CRM:提高管理效率需做好业绩预测
  2. 广工大第12届ACM校赛A
  3. IEnumerable.Select和SelectMany的区别
  4. iOS开发需要哪些图片?
  5. EasyUI-在iframe里获取现阶段选中的tab的标题
  6. Divide and conquer method
  7. 自定义文件系统下的磁盘访问次数计算
  8. CSU1020: 真三国无双
  9. 大型网站的架构设计与演进
  10. ANDROID PAD版本号 PHONE版本号 源代码有什么 差别?