环境光闭塞(Ambient Occlusion)
简介
- 某个点被环境光闭塞的程度,可以通过从其半球面内发射的射线,与其他物体碰撞的情况来判断:如果碰撞的多且近,那么被闭塞的就多
- (离线渲染/闭塞贴图)使用光线投射的方法,随机投射出光线,判断其碰撞
- 使用八叉树来加速射线和三角的碰撞检测
- 使用 xnacollision.h/cpp 库,可以大大简化代码
Screen Space Ambient Occlusion(SSAO)
要点
- 在上边的基础上,只对屏幕上的点做环境光闭塞检测 -> 故而需要屏幕上的点的几何信息(方向、位置)-> 故而需要渲染其法线和深度作为中间贴图
- 检测闭塞的步骤中,使用半球上随机距离的点,检测该位置在屏幕上对应的点的深度,是否离目标足够近(经验值),且在目标点的正面
- 问题:可能是我理解错了?这样一来对于深度值相差比较大的两个模型,其后方的模型在边缘位置的闭塞岂不是不准确?
- 不仅可以用于Ambient部分,还可以用于 diffuse 部分等。
Meshes
要点
- 总体而言这一章是DX自己搞了一个Mesh的格式……涵盖的要素:
- 材质:引用的贴图可以记录文件名
- 顶点:只需记录位置
- 索引
- 子集:记录顶点、面元的索引偏移值,然后依次使用材质列表中的材质
- 骨骼
- 动画
Quaternions
要点
- 计算公式
- 角度的范围是 0 到 pi(为了能够和极坐标一一对应)
- rotate(v) = q v q^(-1)
- 插值:
- 将四元数a和b进行值为t的插值:
- 当a和b非常接近的时候,使用线性插值来避免过小的分母
- 通过检测 ||a-b|| 和 ||a+b|| 的大小关系来决定从a插值到b时,是从哪一侧插值
- 将四元数a和b进行值为t的插值:
角色动作
要点
- to-parent transform; to-root transform; to-world transform
- 注意vertices是在root空间定义的,所以要先转换到其所在骨骼的bind空间
- 顶点融合(skinning)
- 顶点增加数据:4个1byte的(或更多)骨骼点索引、权重
- 对顶点的normal、position等进行加权求和
本书终于完了!