光栅化(Rasterization)

什么是光栅化?

简单来说,光栅化就是将几何数据经过一系列变换(可以说是连点描边裁剪)最终转换为像素,从而呈现在屏幕上的过程。

光栅化的过程

  1. 读取模型的顶点,3个3个的读,因为要画三角形。
  2. 将3个顶点两两连成线,形成三角形。
  3. 计算屏幕像素点在三角形内还是三角形外。在三角形内部的,就上色(颜色是之前算出来的),在三角形外部的,就不上色。
    (注意:如果一个三角形挡在另一个三角形前面,我们应该只画前面的三角形。所以这里还需要比较一下正准备上色的这个像素点是不是已经上过色了。如果这个像素点已经上过色了,并且它是被Z=1的顶点上的色,而我们正准备上色的这个顶点的Z=2(说明这个顶点被挡在了后面),那么这个顶点就不应该上色,因为它是被挡住的点。)

目前,我们使用两种着色模式:平面着色平滑着色

如果使用平面着色,每个图元的每个像素都被一致的赋予该图元的第一个顶点所指定的颜色,由三个顶点构成的三角形将是红色,原因是第一个顶点是红色的。平面着色容易使物体呈现出“块状”,这是因为各颜色之间没有平滑的过渡。一种更好的着色模式是平滑着色。图元中的各像素值由各顶点的颜色经线性插值得到。

  1. 不断的循环以上三个步骤。

如何判断屏幕的哪些像素点在该三角形内部?

主流的算法有两种:

  1. LEE(Linear Expression Evaluation)
  2. Scan Line

LEE(Linear Expression Evaluation)线性表达式评估

  1. 首先因为屏幕只有二维,所以判断点和边的位置关系的时候可以先不管Z,Z只是用来判断前后遮挡的。
  2. 按照顺时针(或者逆时针)的顺序,连接v1v2, v2v3, v3v1,这样就得到了三条边。
  3. 假定边的头是(X+dX, Y+dY),尾是(X, Y) 计算这3条边的方程:E(x,y) = dY(x-X)-dX(y-Y)
    展开之后是dYx + (-dX)y + (dXY-dYX) = 0 即Ax + By + C =0 其中A = dY, B =
    -dX, C = dXY-dYX 我们把v1v2, v2v3, v3v1三条边的A, B, C都求出来,就得到了3条边的方程E1, E2, E3。
  4. 将屏幕像素点的x,y带入方程,A1x + B1y + C1 = E1,如果点在边上,则E1=0,如果点不在边上,则E1!=0。
  5. 最神奇的地方来了。 如果点(x,y)带入3个方程的结果E1, E2,
    E3同时大于0或者同时小于0,即同号,则该点在三角形内,如果异号,则在三角形外。
  6. 每次获得3个点之后,取出其中的min_x, max_x, min_y,
    max_y构成的四边形,将屏幕像素点(x,y)中,在该范围内的点取出,带入LEE公式比较结果。
    如果该点在三角形内,并且没有被遮挡(需要对Z进行判断),则上色,否则不上色。不断迭代,直到所有的三角形都被处理完成,3D模型也画到了屏幕上。

需要注意的地方:

由于多个三角形的边和边是互相挨着的,所以如果直接按上面的方法画,会有很多边重复画了2遍,为了提高渲染效率,我们需要保证每条边只画一遍。 只画三角形的左边和上边。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值