v4vendeta's homepage

Home | About | Contacts | Blogs| Others

光栅化软渲染器_几何阶段

将三维模型显示在屏幕上一般需要以下几个步骤

模型坐标变换

我们所建立的坐标系是世界坐标系,渲染的物体在世界坐标系中的位置是要人为规定的,每个模型都有自己独立的坐标系,第一步就是将物体在模型坐标系的坐标转换成世界坐标系的坐标

可以用将点左乘平移和旋转矩阵来达到目的

平移和旋转的次序不同,变换的结果也不同(矩阵乘法运算无交换律)

Model矩阵

视图变换

我们只需要渲染在摄像机视野范围内的物体

我们希望 指向轴负方向,即相机朝向的方向是屏幕里侧

构建View矩阵

已知三个向量 根据空间几何的知识可以推算出视图坐标系的坐标基 将摄像机平移到原点

实际管线中是把世界坐标中的物体转换到摄像机坐标系中,因此要左乘V的逆矩阵()

投影变换

投影变换我们仅考虑透视投影,我们的摄像机所看到的范围是一个视锥体,我们希望把视锥体内部的物体映射到齐次裁剪空间内,显示再屏幕上,视锥体外的物体剔除掉

设投影变换前的点$p(px,py,pz)$,第一步我们将视锥体内的点映射到近平面,根据相似三角形得到下面两个等式(z坐标均为负值)

将矩形内的x,y映射成[-1,1]

这样我们就获得了变换后的x,y坐标,也就得到透视矩阵的前两行 我们希望w保存z坐标,即w=-z

当Frustum内的点投影到近剪裁平面的时候,所有位于线段p’p上的点,最终都会投影到p’点。

所以z’坐标可以直接保存p点的z值。因为在光栅化之前,我们需要对z坐标的倒数进行插值,所以可以将z’‘写成z的一次表达式形式,如下

将z端点带入,近平面z=near时为-1,z=far时为1

解得

最终的透视投影矩阵

裁剪

裁剪这一步的作用是提高渲染效率,剔除裁剪空间外部的图形,如果空间边缘分割了某个图形,将其分裂成数个小三角形再进行下一步渲染

透视除法

齐次坐标的意义

在欧几里得空间内,两条平行的线是永远无法相交的

然而,在投影空间中,情况就不再如此,例如,当火车铁路远离眼睛时,上图的铁路变得越来越窄。最后,两个平行导轨在地平线上相遇,这个点的距离无穷大

为了从同裁剪坐标(x,y,w)转换为笛卡尔坐标,我们只需将x和y 除以w;

屏幕映射

将区间为[-1,1]的x,y坐标映射到屏幕空间上

总结

以上这些步骤也是渲染管线中几何阶段的主要步骤,下一章我们将介绍光栅化的过程

reference:

《Real-Time Rendering Fourth Edition》

.. ... ...