我想编写一个渲染器,但是我是否真的必须使用OpenGL管道,我不能自己制作吗?有什么方法可以编写从内存管理到栅格化的所有GPU和CPU代码,还是必须使用已经提供的管道?如果我在OpenGL中无法做到这一点,该怎么办?我可以得到一些指示吗? 我用什么语言编写GPU代码以及如何在GPU上使用它?
答案 0 :(得分:3)
当前标准的消费级GPU不是CPU。您无需“编程”图形管道。图形管道之所以如此,是因为这就是设计GPU工作的方式。显然,不同的特定GPU将具有不同的实现,但是渲染管线的基本元素都是硬件的基本部分。可编程的管线部分只能在GPU允许的范围内以及该阶段的预期目的(具有一定的灵活性)进行编程。
未来的GPU可能会更加灵活,某些现代GPU中甚至有alternative pipelines for vertex processing。但是我们还没有到您可以随心所欲地整理东西的地步。 GPU专为提高效率而设计;它们的局限性可以帮助事情走上一条有效的道路。
内存管理是一个完全独立的问题。与像OpenGL这样的即时API相比,Vulkan和类似的命令缓冲区API提供了更多的低级内存管理功能。但是,应该很好地理解,对于业余程序员来说,命令缓冲区API不是 。这些API一点也不友好。他们要求您敏锐地意识到即时API会对您隐藏的许多细节,并且在您违反规则时它们不会告诉您。
答案 1 :(得分:0)
您可以编写一个可以直接调用图形驱动程序的库,也可以编写一个在cpu上运行的自定义管道,从功能上讲,它是专用图形硬件的仿真器,但是它很复杂,不可靠,运行缓慢,并且可能会花费很多时间来实施,而投资回报却很少。
正如评论中提到的那样,GPU的工作方式与之相同,因为它们是在硬件级别设计的,可以做到这一点。 OpenGL / DirectX / Vulkan api只允许您对管道进行更多或更少的控制,并插入自定义着色器阶段。
之所以不能编写自己的光栅化器,是因为它是流水线中的一个阶段,在此阶段中,其效率要尽可能地高。您的版本可能不会更好。
不要对管道的非可编程部分过于关注。那是硬件工程师和驱动程序程序员的权限。
如果要对现有硬件进行大量控制,请尝试DX12或Vulkan / Metal。它们与程序员一样接近硬件,而无需编写自定义驱动程序。