龙书第21章与22章代码例程对比。
Chapter 21 Ambient Occlusion vs Chapter 22 Quaternions
它们在功能侧重上有所不同,SsaoApp.cpp
重点在于屏幕空间环境光遮蔽(SSAO)效果的实现,包含相关计算和渲染流程;QuatApp.cpp
则侧重于动画,尤其是骨骼动画的实现,定义了特定模型的动画关键帧和插值。
1.头文件和命名空间 :SsaoApp.cpp
包含ShadowMap.h
和Ssao.h
,用于阴影映射和屏幕空间环境光遮蔽功能;QuatApp.cpp
包含AnimationHelper.h
,用于动画相关功能。除此之外,其余包含的头文件基本相同。
2.全局常量和结构体 :两个文件中RenderItem
结构体定义基本相同,但SsaoApp.cpp
中定义了RenderLayer
枚举用于区分渲染层,QuatApp.cpp
无此枚举。
3.类的定义和成员变量
类继承与成员变量 :两个类都继承自D3DApp
,但成员变量有所不同。SsaoApp
有用于管理阴影映射、SSAO 的成员变量,如mShadowMap
、mSsao
;而QuatApp
有用于管理动画的成员变量,如mAnimTimePos
、mSkullAnimation
。
渲染项管理 :SsaoApp
使用mRitemLayer
数组按渲染层管理RenderItem
,QuatApp
则使用mOpaqueRitems
向量管理不透明的RenderItem
,并且QuatApp
有指向头骨渲染项的指针mSkullRitem
。
4.初始化和资源构建函数
初始化流程差异 :Initialize
函数中,SsaoApp
在初始化时构建了 SSAO 相关的资源,如设置 PSOs;QuatApp
则在初始化前定义了头骨动画,获取了描述符大小。
资源构建差异 :BuildRootSignature
函数中,SsaoApp
构建了两个根签名(普通和 SSAO),描述符范围和根参数设置与 SSAO 相关;QuatApp
构建了一个普通根签名,描述符范围和根参数设置与纹理采样相关。BuildDescriptorHeaps
函数中,SsaoApp
创建的 SRV 堆包含更多描述符,用于管理多种纹理和缓冲;QuatApp
创建的 SRV 堆描述符数量较少,仅用于管理基本纹理。
几何与材质构建 :BuildShapeGeometry
和BuildSkullGeometry
函数中,SsaoApp
在构建形状和头骨几何时处理方式与QuatApp
不同,QuatApp
在构建头骨几何时从不同文件读取数据并进行特定处理。BuildMaterials
函数中,两个文件定义的材质数量和属性不同。
5.更新和绘制函数
更新逻辑差异 :Update
函数中,SsaoApp
更新与光照、阴影、SSAO 相关的变换和常量缓冲区;QuatApp
更新动画时间、头骨动画,以及相关的常量缓冲区。
绘制流程差异 :Draw
函数中,SsaoApp
执行多个渲染步骤,包括阴影映射、法线和深度绘制、SSAO 计算和主渲染;QuatApp
主要进行不透明物体的绘制。
6.其他函数 :SsaoApp
有专门用于更新阴影变换、主渲染通道、阴影渲染通道和 SSAO 常量缓冲区的函数,以及绘制场景到阴影图、绘制法线和深度的函数;QuatApp
有定义头骨动画关键帧的DefineSkullAnimation
函数。此外,两个文件的GetStaticSamplers
函数返回的静态采样器数量和设置也有所不同。