文章目录
前言
本章的主要内容是通过模板缓冲来实现镜中世界。
对于镜中世界的实现来说,还可以采用一个额外的摄像机来做,当然我也没有实际操作过。
先按照本章内容来通过模板缓冲做一个实现。
模板缓冲的意义
模板缓冲和深度缓冲是一套东西,他们的缓冲区是合在一起处理的。
我们知道深度缓冲可以通过深度检测,来绘制物体的遮挡关系。而模板缓冲呢?就是按照程序设定的规则,额外进行模板检测,只有通过深度+模板检测的像素才会进行下一步的处理。也就是本身是深度缓冲的一个补充,用于用户自定义的检测。
当然也可以单独使用模板检测。
修改camera坐标系
从做第八章光照的时候,就感觉这个坐标系是有问题的。因为调整的结果不符合预期,我原本以为是自己数学水平不够导致的。
后来修改过这个shader中mul的入参顺序(在C++写常量缓冲区时对矩阵做一次转置)。
直到前几天学这个模板缓冲,发现生成的镜子在墙体的右边(d3d12龙书是在左边),然后终于发现MiniEngine采用的居然是右手坐标系。
dx默认的实际是左手坐标系,opengl才是右手坐标系,我挺讨厌这种“靠拢”的行为(甚至于mul入参顺序也是向opengl靠)
那么第一步,我这里就要把这个坐标系改成左手的(否则学习龙书,直接拿到龙书中的顶点集绘制图形,会z轴翻转)
有3个修改点
camera生成的矩阵修改
BaseCamera类只保留3个矩阵
// 0 矩阵变换
// 1. 渲染目标从模型坐标系转到世界坐标系--->世界变换矩阵
// 2. 再从世界坐标系转到视角坐标系--->视角变换矩阵 m_ViewMatrix
// 3. 从视角坐标系转换到投影坐标系--->投影变换矩阵 m_ProjMatrix
// 世界坐标系转换到视角坐标系
Matrix4 m_ViewMatrix; // i.e. "World-to-View" matrix
// 视角坐标系转到投影坐标系
Matrix4 m_ProjMatrix; // i.e. "View-to-Projection" matrix
// 从世界坐标系直接转换到投影坐标系
Matrix4 m_ViewProjMatrix; // i.e. "World-To-Projection" matrix.
Camera.cpp修改如下
void BaseCamera::SetLookDirection( Vector3 forward, Vector3 up )
{
// 计算前方
Scalar forwardLenSq = LengthSquare(forward);
forward = Select(forward * RecipSqrt(forwardLenSq), Vector3(kZUnitVector), forwardLenSq < Scalar(0.000001f));
// 根据提供的上和前方,计算右方
Vector3 right = Cross(up,