《深度探索 C++ 对象模型》第一章重点梳理。主要内容包括:
- C++ 封装对象的布局成本
- C++ 对象模型,详述 C++ 如何组织类对象及其成员
- C++ 继承简述,简述 C++ 三种继承关系和三种继承方式,关于继承布局模型会在之后的章节详述
- C++ 支持多态的三种方式
- 指针类型和多态的实现原理
《深度探索 C++ 对象模型》第一章重点梳理。主要内容包括:
标准的 STL 关联式容器分为 set(集合) / map(映射表)两大类,以及这两大类的衍生体 multiset(多键集合)和 multimap(多键映射表)。这些容器的底层机制均以 RB-tree(红黑树)或hash table(哈希表)完成。
STL的中心思想是:将数据容器和算法分隔开,彼此独立设计,最后再用黏合剂将它们撮合在一起。容器和算法的泛型化,可以用 C++ 的 class template 和 function template 来实现,而迭代器(Iterator)就是二者的黏合剂了。
游戏引擎是一个庞大的软件系统,也是最接近操作系统的大型软件,因此会涉及非常复杂的架构设计、资源管理和和代码实现。这一节我们简要学习一个游戏引擎必备的几个重要模块及其功能,了解游戏引擎的宏观分层架构。
上一节我们实现了基于蒙特卡洛积分的渲染方程并了解了重要性采样在光线追踪中的作用。这一节我们根据不同的概率密度来直接生成随机方向。经过上一节的推导,我们知道了之前实现的散射函数中的随机方向对应的概率密度是什么,但是没有显式的用概率密度去直接产生随机方向,而是用一个均匀分布(单位球面上随机取点)加上一个法线偏移达到这样的效果。这一节我们来实现直接生成给定概率密度的随机方向。
到目前为止我们已经实现了一个完整的光线追踪器,但距离真正的光线追踪其还差极为艰难的一步,也就是我们之前在渲染 Cornell Box 的时候提到的,画面噪声很大是因为光源太小,由于我们对散射光线的随机采样是使用最基本的采样方式,所以当光源很小的时候,光线打到光源的概率就很小,也就导致了噪声过大。从这一节开始我们就来解决这个问题。