计算机图形学中的光栅化

光栅化

  • 1.屏幕
    • 1.2.屏幕分类
    • 1.3.屏幕分辨率
  • 2.像素(Pixel,缩写px)
  • 3.屏幕空间
    • 3.1 规范立方体转化到屏幕空间
  • 4.光栅化
  • 5.像素表示三角形
  • 5.1 2D的采样方法进行光栅化

1.屏幕

屏幕也称显示屏,屏幕是一个典型的光栅显示设备,常用的显示屏又有标屏与宽屏,标屏宽高比为 4:3,宽屏宽高比为 16:10 或 16:9。

1.2.屏幕分类

  • CRT显示屏幕(阴极射线管显示器)
  • LCD/OLED液晶屏幕
  • LED屏幕
  • Electrophoretic(电子墨水屏)如kindle

1.3.屏幕分辨率

屏幕分辨率是指纵横向上的像素点数,单位是px,屏幕分辨率确定计算机屏幕上显示多少信息的设置,以水平和垂直像素来衡量。就相同大小的屏幕而言,当屏幕分辨率低时(例如 640 x 480),在屏幕上显示的像素少,单个像素尺寸比较大。屏幕分辨率高时(例如 1600 x 1200),在屏幕上显示的像素多,单个像素尺寸比较小。

2.像素(Pixel,缩写px)

像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
从像素的思想派生出几个其它类型的概念,如体素(voxel)、纹素(texel)和曲面元素(surfel),它们被用于其它计算机图形学和图像处理应用。

3.屏幕空间

用像素数组定义一个屏幕空间,如图:
计算机图形学中的光栅化_第1张图片
这里需要注意:

  • 像素的坐标(数组中的索引)(x,y)总是一个整数
  • 像素的坐标从(0,0)到(width - 1, height - 1)。width和height为屏幕的宽高,如1920X1080
  • 像素(x,y)的坐标的中心为(x+0.5 , y+0.5),如上图绿色的像素,坐标为(2,1),中心坐标为(2.5,1.5)
  • 屏幕的范围为(0,0)到 (width,height)

3.1 规范立方体转化到屏幕空间

转化过程中注意:
与Z无关(z的值其实是物体在世界空间中的深度值,目前只考虑有一个物体,所以不考虑深度信息)
对xoy平面进行转换,[-1,1]^2转换到 [0,width] × [0,height]
计算机图形学中的光栅化_第2张图片
对xoy平面转换的矩阵为:
M viewport  = ( w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ) M_{\text {viewport }}=\left(\begin{array}{cccc}\frac{w i d t h}{2} & 0 & 0 & \frac{w i d t h}{2} \\ 0 & \frac{h e i g h t}{2} & 0 & \frac{h e i g h t}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Mviewport =2width00002height0000102width2height01
称之为视口矩阵。对这个矩阵进行解析:
先将规范立方体的中心移动到(width/2,height/2)的位置,然后再对规范立方体进行缩放,接着对其进行平移,因为规范立方体中的中心位于原点的位置,而屏幕空间的坐标是从左下角开始为原点(0,0),不存在负坐标。因为与z无关,所以对z不做任何变换。

4.光栅化

光栅化就是将投影的内容画到屏幕上的过程,其过程就如上面所说,最终将规范立方体的内容画到了屏幕上,这个过程就是光栅化。

5.像素表示三角形

像素是一个颜色均匀分布的正方形的小格子,那么如果遇到下面这种情况,如何用像素表示三角形?
计算机图形学中的光栅化_第3张图片
一个简单的解决方法是采样(sampling)
比如我有一个函数f(x,y),在屏幕上的根据要求 ,比如隔一个点求一个f(x,y)的值,或者求一小块区域内的某一个点的作为这个区域的值,这就是采样。我们可以通过采样对函数离散化。

5.1 2D的采样方法进行光栅化

计算机图形学中的光栅化_第4张图片
像素中心作为采样点,如果该点位于三角形内部,用橙色标记,如果不在则不变。
计算机图形学中的光栅化_第5张图片
用函数的实现就是定义一个二值函数: inside(tri,x,y)
inside ( t , x , y ) { 1  Point  ( x , y )  in triangle  t 0  otherwise  (t, x, y) \begin{cases}1 & \text { Point }(x, y) \\ & \text { in triangle } t \\ 0 & \text { otherwise }\end{cases} (t,x,y)10 Point (x,y) in triangle t otherwise 
如图所示:
计算机图形学中的光栅化_第6张图片

//伪代码
for(int x=0;x<xmax;++x)
{
	for(int y=.;y<ymax;++y)
	{
	image[x][y]=inside(tri,x+0.5,y+0.5);
	}
}	

这边有一个问题如何判断像素中心点是否在三角形内部
方法一:面积法
计算三角形顶点与像素点围成的面积与原始三角形面积的大小是否一致。如图所示,若是像素点位于三角形内部面积一致,若是像素点位于三角形外部面积则大于原始三角形面积。
计算机图形学中的光栅化_第7张图片
方法二:叉乘
按照逆时针(或者顺时针)的方式,判断边向量和该边向量的出发点到该点的向量 的叉乘是否都指向屏幕内或者屏幕外。若是,则点在在三角形内部,若不是,则点在三角形外部。如图所示:
在三角形内部
计算机图形学中的光栅化_第8张图片
在三角形外部
计算机图形学中的光栅化_第9张图片
对所有像素中心点做上述采样操作得到的采样会出现锯齿,如图所示,橙色点为像素中心点计算机图形学中的光栅化_第10张图片
如果用上面的方法进行光栅化,那么最后得到的三角形就是这样的计算机图形学中的光栅化_第11张图片
这和我们想要的三角形相差太多,锯齿很明显。所以就要对其进行抗锯齿操作,之后会介绍。

你可能感兴趣的:(计算机图形学,光栅化)