【问题标题】:How is the GPU "instructed" to render an image?GPU如何“指示”渲染图像?
【发布时间】:2020-11-23 01:54:35
【问题描述】:

如果这个问题被关闭了,请告诉我,因为我不想让平台上出现离题的问题!

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

假设我想将数字 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 的场景),然后会“神奇地”渲染一个白色矩形。我想知道的是引擎盖下发生了什么。为什么这个确切的框架可以让你画一个矩形。什么是汇编代码(比如,对于 Intel Core M),它使 GPU 计算出这个矩形的样子? SpriteKit 如何在 Swift/Objective C 的基础上构建来真正做到这一点(我可以自己做到这一点)吗?

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

附:我想要一个非常详细的答案,而不是“CPU '告诉' GPU 绘制一个矩形”——CPU 不会说话!

【问题讨论】:

    标签: graphics gpu rendering


    【解决方案1】:

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

    通过并行化(如在 GPU 上),不同的方法变得更流行。它仅渲染三角形(因此您需要对多边形进行三角剖分)并渲染如下:

    1. 计算 AABB

      那么简单的最小,最大x,y三角形顶点坐标。

    2. 循环通过 AABB

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

    3. 对于每个片段

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

    所有这些都在片段着色器阶段之前完成,并且通常所有这些(或大部分)都在硬件中实现,因此无需代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多