你能制作自己的渲染管线吗?

Can you make your own rendering pipeline?

我想写一个渲染器,但我真的必须使用 OpenGL 管道吗,我不能自己做吗?有没有一种方法可以为 GPU 和 CPU 编写从内存管理到光栅化的所有代码,还是我必须使用已经提供的管道?如果我不能在 OpenGL 中做到这一点,我可以在哪里?我能得到一些指示吗? 我用什么语言编写 GPU 代码以及如何在 GPU 上使用它?

目前标准的消费级 GPU 不是 CPU。您没有 "program" 图形管道。图形管道之所以如此,是因为这就是 GPU 设计的工作方式。显然,不同的特定 GPU 会有不同的实现,但渲染管线的基本元素都是硬件的基础部分。流水线的可编程部分只能在 GPU 允许的范围内以及该阶段的预期目的(具有一定的灵活性)进行编程。

未来的 GPU 可能会更加灵活,某些现代 GPU 中甚至有一些 alternative pipelines for vertex processing。但我们还没有到你可以随意编造东西的地步。 GPU 专为提高效率而设计;他们的局限性是为了帮助事情保持在有效的道路上。

内存管理是一个完全独立的问题。与 OpenGL 等即时 API 相比,Vulkan 和类似的命令缓冲区 API 允许更多低级内存管理功能。但是,应该很好理解命令缓冲区 API 不是 对于业余程序员。这些 API 一点都不友好;它们要求您敏锐地意识到即时 API 向您隐藏的许多细节,并且当您违反它们的规则时它们不会告诉您。

您可以编写一个库来直接调用图形驱动程序,或者您可以编写一个在 cpu 上运行的自定义管道,这在功能上是专用图形硬件的模拟器,但它会复杂、不可靠、缓慢,并且可能会花费您大量时间来实施,而投资很少 return。

正如评论中提到的那样,GPU 的工作方式是这样的,因为它们是在硬件级别上设计的。 OpenGL/DirectX/Vulkan api 只允许您对该管道有更多或更少的控制,并插入自定义着色器阶段。

您不能编写自己的光栅器的原因是,它是管道中的一个阶段,它的效率几乎是最高的。您的版本不太可能更好。

不要太担心流水线的非可编程部分。那是硬件工程师和驱动程序员的权限。

如果您想对现有硬件进行大量控制,请尝试 DX12 或 Vulkan/Metal。它们与程序员一样接近硬件,无需编写自定义驱动程序。