光栅化
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)
3.屏幕空间
- 像素的坐标(数组中的索引)(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 规范立方体转化到屏幕空间
4.光栅化
光栅化就是将投影的内容画到屏幕上的过程,其过程就如上面所说,最终将规范立方体的内容画到了屏幕上,这个过程就是光栅化。
5.像素表示三角形
5.1 2D的采样方法进行光栅化

像素中心作为采样点,如果该点位于三角形内部,用橙色标记,如果不在则不变。

用函数的实现就是定义一个二值函数: 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
如图所示:

//伪代码 for(int x=0;x<xmax;++x) {
for(int y=.;y<ymax;++y) {
image[x][y]=inside(tri,x+0.5,y+0.5); } }
这边有一个问题如何判断像素中心点是否在三角形内部
方法一:面积法
计算三角形顶点与像素点围成的面积与原始三角形面积的大小是否一致。如图所示,若是像素点位于三角形内部面积一致,若是像素点位于三角形外部面积则大于原始三角形面积。

方法二:叉乘
按照逆时针(或者顺时针)的方式,判断边向量和该边向量的出发点到该点的向量 的叉乘是否都指向屏幕内或者屏幕外。若是,则点在在三角形内部,若不是,则点在三角形外部。如图所示:
在三角形内部

在三角形外部

对所有像素中心点做上述采样操作得到的采样会出现锯齿,如图所示,橙色点为像素中心点
如果用上面的方法进行光栅化,那么最后得到的三角形就是这样的
这和我们想要的三角形相差太多,锯齿很明显。所以就要对其进行抗锯齿操作,之后会介绍。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178100.html原文链接:https://javaforall.net
