一、 什么是光栅化?
光栅化作用是将几何数据变换后转换为像素呈现在显示设备上的一个过程。几何数据转换为像素,
本质是坐标变换、几何离散化,如下:
其中包含了坐标变换和几何离散化:
二、光栅化完成了什么
3D中,物体是3维的,拥有X, Y, Z三个坐标,并且拥有R, G, B三种颜色,alpha透明度,U, V贴图坐标,N法线。
三维物体在二维屏幕上的显示,大致分为以下几步:
- 坐标变换(transform)
将场景中的三维坐标转换为二维坐标,这个请参考我的文章坐标系空间变换。 - 颜色计算(shade)
计算每个顶点的颜色,通过UV贴图的颜色,结合光照,透明度等,计算出模型每个顶点的具体颜色(R, G, B)。 - 光栅化(rasterization)
假定屏幕分辨率为1920×1080,在二维屏幕渲染(光栅化)时,内存中frame buffer只保存着1920×1080个屏幕点的颜色,然后一个一个的画到屏幕上。(它的实现方式是以一个1920×1080长的一维数组储存每个顶点的RGB颜色,然后遍历数组画出来)
什么X, Y, Z,什么alpha之类的frame buffer都没有的,在frame buffer里只有3个值:R, G, B。
X, Y, Z, alpha等等属性要在另外的地方存储。
光栅化,就是计算出1920×1080这么长的RGB数组中,每一个RGB的值。
三、光栅化怎么完成的
我们计算出了3D模型每个顶点的颜色,这个是基于3维坐标的,顶点的三维坐标可以是小数。
但在屏幕渲染时,屏幕是只有X,Y二维的,并且其像素点坐标都是整数。1920×1080的屏幕只有1920×1080=2073600个像素点。所以光栅化的连点描边是一个近似过程。
目前主流的面片分割是三角形分割,所以大家在3DS MAX或者MAYA里看3D模型的网格,基本都是三角形网格,但也有以四边形为最小分割的算法,这里不涉及,我们认为3D模型的面片单元都是三角形。而光栅化主要有以下几步:
- 读取模型的顶点,3个3个的读,因为要画三角形。
- 将3个顶点两两连成线,形成三角形。
- 计算屏幕像素点在三角形内还是三角形外。在三角形内部的,就上色(颜色是之前算出来的),在三角形外部的,就不上色。
(注意:如果一个三角形挡在另一个三角形前面,我们应该只画前面的三角形。所以这里还需要比较一下正准备上色的这个像素点是不是已经上过色了。如果这个像素点已经上过色了,并且它是被Z=1的顶点上的色,而我们正准备上色的这个顶点的Z=2(说明这个顶点被挡在了后面),那么这个顶点就不应该上色,因为它是被挡住的点。) - 不断的循环,直到画完3D模型的所有三角形,这样一个模型就出来了!
总结:
总的来说,像素和纹素实际上是点,不是实体的块。屏幕空间原点是左上角的物理像素,但是纹理坐标原点是纹素矩形的最左上角。最重要的是,记住当你要将纹理中的纹素正确的映射到屏幕空间中的像素时,你需要减去0.5个单位。