#1 楼
高度专业的硬件处理它。 GPU的典型策略是平铺光栅化并以压缩格式存储深度信息(例如,当多边形完全覆盖平铺时的z方程)。这样可以一次在整个图块上进行测试;其他很酷的HW技巧包括在运行像素着色器之前进行深度测试(假设条件允许-着色器无法写入深度值)。您可能会考虑在软件中进行一些类似的操作,例如让每个线程“拥有”一个瓦片子集并独立遍历每个图元,或者模仿多gpu策略,例如替换帧或替换栅格线。#2 楼
在真实的GPU中,深度缓冲区不是分成多个核心来尝试读取/写入深度缓冲区的相同区域并尝试在它们之间进行同步,而是将其划分为图块(例如16×16或32×32),每个图块磁贴被分配给单个核心。然后,该核心负责该图块中的所有栅格化:所有与该图块接触的三角形将被拥有的核心(在该图块内)栅格化。这样一来,内核之间就不会产生干扰,并且在访问帧缓冲区的一部分时也无需它们进行同步。这意味着接触多个图块的三角形将需要由多个内核进行栅格化。因此,在几何处理(在顶点和三角形上进行操作)和像素处理之间存在工作重新分配步骤。
在几何阶段,每个内核都可以处理大量输入图元。然后对于每个图元,它可以快速确定图元接触的图块(这称为“粗光栅化”),并将图元添加到拥有一个受影响图块之一的每个核的队列中。
然后,在像素阶段,每个内核都可以读出其队列中的基元列表,计算该内核拥有的图块的像素覆盖率,并进行深度测试,像素着色和更新帧缓冲区,而无需任何进一步的协调与其他内核。