光栅化流程
Last updated
Last updated
屏幕是一个(二维)像素数组,数组的大小就是分辨率(resolution),是一种典型的光栅显示器。像素(pixel)可以被当作是一个颜色均匀的小方块,颜色是(red,green,blue)三色的混合。
对于每个图像基元(primitive),如三角形,点亮哪些像素
非常快(在GPU中数十亿个三角形每秒)
很难(但并非不可能)实现真实图片效果
非常适合2d vector art,fonts,quick 3D preview
对于每个像素我们可以看到哪些图像基元,很容易实现真实图像效果,一般来讲很慢。
基于光栅化的现代实时图像生成
Input:图像基元——基本都是点(points)和三角形(triangles),可能有其他属性(例如颜色)
output:图像(可能有深度、透明度等)
光栅化管道将所有的图像基元转换为三角形,因为三角形可以近似任何形状,总是平面的,有定义明确的法线。我们可以定义良好的三角形顶点插值(重心插值法)。一旦所有东西都被简化为三角形,就可以专注于设计一个深度优化的绘制过程。
钻石规则(现代GPU使用):如果线穿过相应的钻石,就点亮像素。
这种方式易于实现,但是不是当代软件/硬件画线的唯一方式。
测量一个函数在某点的值就是采样 Sampling。我们可以通过周期采样来离散化函数。
采样是图形学的核心思想,可以采样时间(1D)、面积(2D)、和体积(3D)。
若像素中心在三角形内,则采样。光栅化其实就是采样一个2D指示函数。
三角形其实就三个半平面的交集:
当采样点落在边上时,如果边是“顶边”或“左边”,则该采样被分类为三角形内
顶边(top edge):高于所有其他边的水平边
左边(left edge):非水平且位于三角形左侧的边(三角形可以有一个或两个左边)
通过增量式技术提高半平面检查的计算效率。增量式方法以一种与数据在内存中的排列方式相一致的模式访问内存,这可以大大提高渲染的速度。
增量式遍历是串行的,现代硬件支持高度并行计算。所以可以有一种替代方案:并行检测三角形“包围盒”内所有样本点,大量的并行可以抵消额外的测试。
但是对于一个细长的三角形,初级的并行策略依然非常低效。
理念:从粗到细,首先检查块是否与三角形相交,如果没有,完全跳出此块。如果块包含在三角形内,则块内所有点都被覆盖了。否则,并测试块中的每个采样点。