如何在GPU中更新深度缓冲区?


10

现在,我正在尝试在软件中实现某种深度缓冲区,并且在编写该缓冲区时遇到了一个大问题。拥有一个互斥体绝对是多余的。因此,我创建了数量与线程数相等的互斥体。我正在基于当前像素(pixel_index%Mutexes_number)锁定互斥锁,效果更好,但仍然非常慢。我不知道它是如何在真实的GPU中完成的?有聪明的算法或硬件可以处理吗?

Answers:


9

高度专业的硬件可以处理它。GPU的典型策略是平铺栅格化并以压缩格式存储深度信息(例如,当多边形完全覆盖平铺时的z方程)。这样可以一次在整个图块上进行测试;其他很酷的硬件技巧包括在运行像素着色器之前进行深度测试(假设条件允许-着色器无法写入深度值)。您可能会考虑在软件中进行类似的操作,例如让每个线程“拥有”图块的子集并独立遍历每个图元,或者模仿多gpu策略,例如替换帧或替换栅格线。


11

在真实的GPU中,将深度缓冲区划分为图块(例如16×16或32×32),而不是让多个内核尝试读取/写入深度缓冲区的相同区域并尝试在它们之间进行同步,磁贴被分配给单个核心。然后,该核心负责该图块中的所有栅格化:所有与该图块接触的三角形都将被拥有的核心(在该图块内)栅格化。这样,内核之间就不会产生干扰,并且在访问帧缓冲区的一部分时也无需它们进行同步。

这意味着接触多个图块的三角形将需要由多个核心进行栅格化。因此,在几何处理(对顶点和三角形的操作)和像素处理之间存在工作重新分配步骤。

在几何阶段,每个核心可能会处理大量的输入图元。然后,对于每个图元,它可以快速确定图元触摸了哪些图块(这称为“粗光栅化”),并将图元添加到拥有一个受影响图块之一的每个核心的队列中。

然后,在像素阶段,每个内核都可以读出其队列中的图元列表,计算该内核拥有的图块的像素覆盖率,然后进行深度测试,像素着色和更新帧缓冲区,而无需任何进一步的协调与其他核心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.