上一篇文章分析了平面镜反射效果实现中,如何计算镜像矩阵,我们已经可以得到镜像相机并渲染出镜像后的效果了,但是只是纯粹的镜像会遇到以下问题:
如图,当相机镜像到C’位置后,其视锥体裁剪范围是A+B,但实际应该位于反射贴图中的区域仅仅只有A区域,也就是我们需要根据平面P对相机C’裁剪。
投影矩阵:
先回顾一下渲染管线中的投影变换阶段,该阶段将相机空间的坐标变换到投影空间,以便于裁剪。
投影变换后会得到一个归一化设备坐标(NDC),其值在视锥体内的范围分别是x:[-1,1],y[-1,1],z:[-1,1](Direct3D中是[0,1],OpenGL中是[-1,1],unity采用了OpenGL的NDC)
投影矩阵可以通过相机的相关参数计算得到:
透视投影:
| 1/(tan(fov/2)*aspect) 0 0 0|
|0 1/tan(fov/2) 0 0|
|0 0 -(far+near)/(far-near) -2*near*far/(far-near)|
|0 0 -1 0|
正交投影:
|1/(aspect*size) 0 0 0|
|0 1/size 0 0|
|0 0 -2/(far-near) -(far+near)/(far-near)|
|0 0 0 1|
投影矩阵的详细推导可以参考相关文章,这里限于篇幅只给出具体的公式以方便下面的计算。
投影矩阵的推导:http://www.songho.ca/opengl/gl_projectionmatrix.html
近裁面和远裁面:
相机的视锥体由六个平面围成,其每个平面都可以用投影矩阵中的分量计算得到,但对于我们要实现的镜面反射效果,最重要的就是近裁面和远裁面,因此这里只考虑这两个平面。