GPU "instructed" 是如何渲染图像的?

How is the GPU "instructed" to render an image?

如果这个问题不存在,请告诉我,因为我不想用离题的问题弄乱平台!

无论如何,由于我编写了一些代码,我很难找到有关渲染图像时实际发生的事情的信息。

假设我想将数字 5 和 3 相加。CPU 会将 5 写入一个寄存器,将 3 写入另一个寄存器。 ALU 会负责计算并输出 8。没关系,CPU 使用 MOVE 和 ADD 来产生结果。

然而,我没有找到任何信息,是当我想绘制一个矩形时发生了什么。大多数编程语言都有可导入的框架,可让您执行此操作。例如,在 SpriteKit (Swift & Objc) 中,你可以这样写

let node = SKSpriteNode(color: .white, size: CGSize(width: 200, height: 300))

并将 node 添加到 SKScene(只是一个包含 childNodes 的场景),然后会“神奇地”渲染一个白色矩形。我想知道的是幕后发生的事情。为什么这个确切的框架让你画一个矩形。使 GPU 计算该矩形的外观的汇编代码(例如,对于 Intel Core M)是什么? SpriteKit 如何基于 Swift/Objective C 的基础知识来实际执行此操作(我可以自己执行此操作)吗?

也许是个奇怪的问题,但我觉得我必须知道(是的,有时我 好奇)。谢谢。

P.S。我想要一个非常详细的答案,而不是“CPU 'tells' GPU 绘制矩形”- CPUs 不会说话!

渲染凸多边形的方法有很多种。过去最常用的是 ScanLine algorithm,您只需将所有圆周线栅格化到 left/right 缓冲区中,然后使用水平线进行渲染并沿途插入其他坐标(如 z、r、g、 b,tx,ty,nx,ny,nz...)。这适用于 single-thread CPU 基于 SW 渲染。

随着并行化(如在 GPU 上),不同的方法变得越来越流行。它只渲染三角形(因此您需要对多边形进行三角剖分)并像这样渲染:

  1. 计算 AABB

    所以三角形顶点的 x,y 坐标的最小值,最大值。

  2. 循环 AABB

    这是并行完成的,由 GPU 插值器完成。每个内插(循环)“像素”称为片段(因为它通常包含的不仅仅是颜色)

  3. 每个片段

    并根据结果确定片段是在三角形内部 (s+t<=1) 还是外部 (s+t>1)。如果在内部调用片段着色器。

所有这些都是在片段着色器阶段之前完成的,通常所有这些(或大部分)都是在硬件中实现的,所以没有代码。

如今,GPU 渲染是通过将几何图形传递给 gfx 驱动程序本身来完成的。驱动程序在引擎盖下所做的只是为我们猜测工作,但很可能他们也只是将几何和配置设置传递到 GPU 上的正确位置(内存、寄存器......)。