您可以制作自己的渲染管道吗?
Posted
技术标签:
【中文标题】您可以制作自己的渲染管道吗?【英文标题】:Can you make your own rendering pipeline? 【发布时间】:2019-10-06 16:40:02 【问题描述】:我想写一个渲染器,但我真的必须使用 OpenGL 管道,我不能自己做吗?有没有办法可以为 GPU 和 CPU 编写所有代码,从内存管理到光栅化,还是我必须使用已经提供的管道?如果我不能在 OpenGL 中做到这一点,我在哪里可以?我能得到一些方向吗? 我用什么语言编写 GPU 代码以及如何在 GPU 上使用它?
【问题讨论】:
Vulcan 让您更接近 GPU,如果您想要更接近 GPU,您必须与每个 GPU 供应商交谈以获得驱动程序使用的低级接口(我怀疑您会在这方面取得了很大的成功) @Mark 如果你是图形编程的初学者,(现代的)OpenGL 将会很多年,直到并且如果你的游戏引擎处于可以从更多低级控制中获得任何优势的状态Vulkan 给你的。 如果您真的想避免使用任何“图形 API”,您可以在 CUDA 或 OpenCL 中实现计算,但是 (1) 性能可能会受到很大影响,并且 (2) 您仍然必须使用某种图形 API 将图像显示到屏幕上。与 OpenGL 相比,Vulkan 为您提供的硬件控制级别要低得多,但如果您没有使用过任何一种,我建议您从 OpenGL 开始,如果您发现最新的 OpenGL 是真正的,则稍后再过渡到 Vulkan不足以满足您的需求。 另一方面,你可以走很长的路,编写自己的驱动程序,自己的显卡接口等等 - 或其他东西......我相信这是可能的,但我也确定不值得尝试。 【参考方案1】:目前标准的消费级 GPU 不是 CPU。您不会“编程”图形管道。图形管道就是这样,因为这就是 GPU 的工作方式。显然,不同的具体 GPU 会有不同的实现,但渲染管线的基本元素都是硬件的基础部分。可编程的流水线部分仅在 GPU 允许的范围内以及该阶段的预期目的(具有一定的灵活性)时才可编程。
未来的 GPU 可能会更加灵活,在某些现代 GPU 中甚至有一些 alternative pipelines for vertex processing。但我们还没有达到你可以随心所欲地编造的地步。 GPU 专为提高效率而设计;它们的局限性可以帮助事情保持在有效的道路上。
内存管理是一个完全独立的问题。与 OpenGL 等直接 API 相比,Vulkan 和类似的命令缓冲区 API 允许更多的低级内存管理功能。但是,应该很好地理解命令缓冲区 API 不 适合业余程序员。这些 API 一点也不友好;它们要求您敏锐地意识到即时 API 对您隐藏的许多细节,并且当您违反它们的规则时它们不会告诉您。
【讨论】:
我的目标不是制作一个可以渲染内容的应用程序,而是要知道它是如何做到的。我想为渲染做所有的数学运算。我用 WinAPI 在 CPU 上制作了一个渲染器,一直在三角形上绘制纹理,但速度非常慢,我必须以 20 fps 的速度渲染 10 000 个带纹理的三角形,所以没有空间添加阴影等等高级的东西,我写了绘制三角形和纹理映射的算法等等。 @Mark:但你已经知道它是如何做到的;当您编写软件渲染器时,您证明了这一点。你知道图形是如何工作的。当您希望图形快速工作时,GPU 是适用的。这意味着生活在他们的局限内。一旦你编写了三角形光栅化器的代码,你就已经了解了关于三角形光栅化器的所有知识。一旦您编写了跨三角形插值参数的代码,就无需再学习了。让硬件做好它的工作,这样你就可以去做你的了。 @Mark:如果您是这样的人之一,认为除非他们完全从头开始实施,否则他们并没有真正在做/学习一件事,那么对您没有真正的帮助。没有中间立场;如果您想要“快速,可用”,那么您无法自己编写。你必须使用硬件。而且由于您已经了解了光栅化器的工作原理,所以我看不出放弃软件光栅化器以支持硬件光栅化器的问题是什么。您了解了他们要学习的内容;你还能获得什么? Blender(它曾经使用过 OpenGL) 据我所知,Blender 仍然使用 OpenGL。也就是说,至少用于渲染 ui/editor/preview。渲染器本身不是光栅器,而是光线追踪器,但那是完全不同的故事。 查看github.com/zauonlok/renderer。应该很容易让演示在您的机器上运行。与具有相同功能集的硬件渲染器相比,它确实在性能方面存在困难,但仍然是一个非常令人印象深刻的演示,展示了在纯软件管道中可以实现的目标。【参考方案2】:您可以编写一个库来直接调用图形驱动程序,或者您可以编写一个在 cpu 上运行的自定义管道,它在功能上是专用图形硬件的模拟器,但它会很复杂、不可靠、速度慢,并且可能会花费您大量的时间来实施,而且投资回报率很低。
正如在 cmets 中提到的,GPU 的工作方式与它们的工作方式相同,因为它们在硬件级别上被设计为以这种方式工作。 OpenGL/DirectX/Vulkan api 只是让您可以或多或少地控制该管道,并插入自定义着色器阶段。
您无法编写自己的光栅化器的原因是,它是管道中的一个阶段,其中它几乎是尽可能高效的。您的版本可能不会更好。
不要太在意管道的非可编程部分。这是硬件工程师和驱动程序程序员的权限。
如果您想对现有硬件进行大量控制,请尝试 DX12 或 Vulkan/Metal。它们几乎与程序员一样接近硬件,而无需编写自定义驱动程序。
【讨论】:
以上是关于您可以制作自己的渲染管道吗?的主要内容,如果未能解决你的问题,请参考以下文章