找回密码
 立即注册
查看: 432|回复: 0

GPU图形微架构学习笔记(二)光栅化

[复制链接]
发表于 2021-12-6 18:16 | 显示全部楼层 |阅读模式
图形管线在处理对象上大体分为几何阶段和像素阶段。前者主要是处理顶点和几何图形,后者主要处理像素的颜色。衔接这两个阶段的就是光栅化,他的输入是几何图形,输出是被这些几何图形覆盖的像素点,从而调动着色器运行着色程序计算这些像素该画成什么颜色。



图一:光栅化模块框图

三角形裁减

渲染管线的标准中,只有位于(-1,1)可视立方体内的图形才可见;同时用户也可以指定一些裁减平面使位于裁减平面一侧的三角形可见。所以我们就有一系列的裁减平面,包括可视立方体的六个面以及用户指定的多个面。裁减时有三种情况:

  • 所有顶点都在所有裁减平面内,接受这个三角形
  • 所有顶点都在至少一个裁减平面外,丢弃这个三角形
  • 至少一个裁减平面,顶点同时分布于两侧,裁减这个三角形只留下可见部分
实现的算法之一是萨瑟兰-霍奇曼算法[1]。原理是针对每个裁减平面,遍历三角形的每个边,如果这个边被裁减平面穿过,就添加这个相交点作为新的顶点。将这个算法应用到图形管线的时候我们还需要考虑计算新顶点的属性,也就是相交点需要对三角形原边两个顶点的属性进行插值得到自己的属性[2]。
三角形屏幕映射

屏幕映射就是将裁减坐标系的顶点转换为屏幕坐标系。这样才能判断三角形覆盖了哪些像素点。转换的计算也很简单,首先将裁减坐标系 除以 后得到齐次坐标系 ,然后对XYZ分量进行乘加运算,系数 都是根据屏幕坐标偏移和大小计算出来的常量:


最后GPU会将 分量由浮点表示转换为定点表示。这一方面是因为定点数计算的硬件设计更简单,减少后续模块的资源使用;另一方面,由于经过了可视立方体裁减,坐标都被限制在一个范围之内,更利于定点表示有效的使用比特:获得更高的精度或者减少使用的比特数和计算宽度。
会作为顶点属性传递给后续模块用于插值。
三角形消除

三角形消除就是过滤一些肯定不会输出任何像素的三角形,包括零面积三角形(三个顶点在一条直线)、小三角形(太小了没有覆盖任何采样点)和背面朝向视角的三角形。
过滤背面三角形也叫隐面消除。因为这些三角形无论多大,按照图形标准都是不会贡献最后哪怕一个像素的颜色。这一步的计算很简单,也就是看三角形的法向量的Z轴分量是不是大于零。法向量的Z轴分量计算公式是:



是三角形三个顶点的XY坐标。在硬件上可以设计固定实现以上公式的计算单元过滤输入的三角形。
三角形设置

三角形设置的任务是计算三角形的一些参数供后续步骤用于:

  • 判断一个点是否位于三角形内
  • 对三角形所有顶点的属性进行插值以获取三角形内一点的属性
不同的算法需要计算的参数也不同,这里我们选择使用重心坐标[3][4][5]法进行介绍。重心坐标类似于向量合成,就是以三角形一个顶点为原点,经过顶点的两条边为坐标轴,得到任意一点的坐标表示  ,外加一个联动坐标





图二:重心坐标【4】【5】

重心坐标表示有以下优点:

  • 能同时满足以上两个需求:

    • 位于三角形内的点满足重心坐标的三个分量  都位于(0,1)区间
    • 属性插值可以用重心坐标与三个顶点属性进行计算:

  • 参数数量固定,是三角形的纯几何属性,不会随顶点属性数量的增加而增加。
  • 对着色器插值友好。参见下文属性插值一节。
根据重心坐标的定义,我们可以通过以下方程组求解  :


得出一点的重心坐标计算公式是:


其中:






所以在重心坐标法的情况下,三角形设置模块的主要任务是根据三个顶点的XY坐标计算(A,B,C,D,E,F)这六个参数,以便后续任意一点代入自己的坐标计算  。
三角形遍历

三角形遍历的任务是将输入的三角形所覆盖的像素输出给着色器执行渲染程序。有很多算法可以实现这个功能[6]。比如最简单的"Bounding Box Traversal",就是在一个包围三角形的"Bounding Box"内逐行扫描每个像素判断像素采样点是否在三角形内。还有改良后减少计算的"Backtrack Traversal"以及"Zigzag Traversal"。
现代GPU普遍采用的是"Tiled Traversal"。就是将屏幕分成4x4或者8x8的块,然后遍历"Bounding Box"内的块:

  • 如果块的四个顶点都在三角形内,那这个块内的所有像素都需要渲染,判断依据是 所有顶点的
  • 如果块的四个顶点都在三角形一边的外侧,那这个块全在三角形外,不用渲染,判断依据是所有顶点的 或者所有顶点的 或者所有顶点的 小于等于零
  • 如果三角形任意一边,块的四个顶点分布于两侧,那就无法判断,需要逐个检查块内像素



图三:Tiled Traversal【6】

这种算法先大后小,除了减少计算之外还有利于之后介绍的Early-Z和Hierarchical-Z算法实现,在帧缓冲操作一文中会再讨论。
属性插值

属性插值是根据三角形顶点属性计算渲染像素位置属性的插值过程。我们已经介绍过用重心坐标获取2D线性插值的方法,但这里我们需要注意一个透视正确插值的问题[7]。所以正确的插值计算是:
先计算 的插值结果:


再计算 的插值结果:


最后得出透视正确插值:


所以透视正确重心坐标系的参数为:


早先的GPU光栅化是在固定管线中做属性插值的,所以有一些更适合这种情况的算法存在,比如结合三角形遍历和属性插值的"Incremental Triangle Traversal"。但随着着色器的出现,相比固定管线计算能力、灵活性和可扩展性都更强。所以现在GPU都是在着色器里做属性插值:固定管线只需提供以上透视正确重心坐标系的参数,着色器就能读取顶点属性后完成插值。这里我们也可以看出重心坐标法的好处,就是提供着色器一次固定的参数后就能对任意数量属性进行插值。
Early-Z

在图形渲染管线概念里,深度测试发生在最后的帧缓冲操作里:写入一个像素前,读取深度缓冲里相同位置之前渲染图形的深度信息,如果当前写入的图形更近,写入就能成功,深度信息也更新为当前图形的,反之则什么都不做。在什么都不做的时候,这个像素之前的像素着色计算就浪费了。所以我们引入一个优化就是将深度测试提前到决定这个像素需不需要被着色的时候,也就是三角形遍历阶段。
在遍历三角形覆盖的像素时,插值计算三角形在该像素位置的深度,然后和该像素的深度缓冲信息比较来判断当前图形是否被遮挡。如果是就不需要加入着色器;不是的话就加入着色器同时更新深度缓冲。所以在Early-Z优化下,帧缓冲操作模块需要和光栅化模块交互以读写深度缓冲信息。
Early-Z能减少很多像素着色任务,是现代GPU的必备优化之一。想要达到最大效果,用户最好是按由近及远的顺序绘制,从而让近的图形尽早屏蔽掉远方图形的绘制任务。当然即使注意绘制顺序,完全屏蔽无效绘制也不容易做到,我们会在后续的延迟渲染一文中再次讨论。
最后要注意的是Early-Z在有些情况下是实效的,比如像素着色器中使用"discard"丢弃当前计算像素,或者开了Alpha Blend。这些操作都是在光栅化之后才影响深度缓冲的,所以如果有这些操作,光栅化里的Early-Z就应该被关闭。
总结

本文介绍了光栅化固定管线内部的各个流程模块以及他们要实现的任务——各种算法公式。随着图形技术的发展,我们会发现越来越多光栅化固定管线中的任务转移到了着色器,包括上面提到的属性插值,以及三角形裁减和消除,这些会在后面的网格着色器一文中讨论。
参考


  • ^萨瑟兰-霍奇曼算法https://zh.wikipedia.org/wiki/%E8%90%A8%E7%91%9F%E5%85%B0-%E9%9C%8D%E5%A5%87%E6%9B%BC%E7%AE%97%E6%B3%95
  • ^Clipping Triangleshttps://gabrielgambetta.com/computer-graphics-from-scratch/11-clipping.html#clipping-triangles
  • ^Barycentric coordinate systemhttps://en.wikipedia.org/wiki/Barycentric_coordinate_system
  • ^CSSE 351 Computer Graphicshttps://www.rose-hulman.edu/class/csse/csse351-abet/m10/triangle_fill.pdf
  • ^CMU 15-769 VISUAL COMPUTING SYSTEMShttp://graphics.cs.cmu.edu/courses/15769/fall2016/lecture/visibility/slide_057
  • ^EDAN35 - High Performance Computer Graphicshttps://fileadmin.cs.lth.se/cs/Education/EDAN35/lectures/L2-rasterization.pdf
  • ^Perspective-Correct Interpolationhttps://www.comp.nus.edu.sg/~lowkl/publications/lowk_persp_interp_techrep.pdf

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-15 04:49 , Processed in 0.136053 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表