Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 您可以创建自己的渲染管道吗?_C++_Opengl_Shader_Pipeline - Fatal编程技术网

C++ 您可以创建自己的渲染管道吗?

C++ 您可以创建自己的渲染管道吗?,c++,opengl,shader,pipeline,C++,Opengl,Shader,Pipeline,我想写一个渲染器,但我真的必须使用OpenGL管道,我不能自己做吗?有没有一种方法可以为GPU和CPU编写所有代码,从内存管理到光栅化,还是必须使用已经提供的管道?如果我不能在OpenGL中完成,我在哪里可以?我能知道一些方向吗? 我应该用什么语言编写GPU代码以及如何在GPU上使用它?消费者级GPU,因为它们目前不是标准的CPU。您不需要“编程”图形管道。图形管道就是这样,因为GPU就是这样设计的。显然,不同的特定GPU将有不同的实现,但渲染管道的基本元素都是硬件的基本部分。管道中可编程的部分

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

消费者级GPU,因为它们目前不是标准的CPU。您不需要“编程”图形管道。图形管道就是这样,因为GPU就是这样设计的。显然,不同的特定GPU将有不同的实现,但渲染管道的基本元素都是硬件的基本部分。管道中可编程的部分仅在GPU允许的范围内可编程,并用于该阶段的预期目的(具有一定的灵活性)

未来的GPU可能更加灵活,甚至在某些现代GPU中也有一些。但我们还没有到你可以随心所欲的地步。GPU是为提高效率而设计的;它们的局限性在于帮助事情保持高效


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

您可以编写一个库,直接调用图形驱动程序,或者编写一个在cpu上运行的自定义管道,它在功能上是专用图形硬件的仿真器,但它复杂、不可靠、速度慢,而且可能需要花费大量时间来实现,而且投资回报很低

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

您无法编写自己的光栅化器的原因是,它是管道中的一个阶段,在这个阶段中,它的效率非常高。你的版本不太可能更好

不要太在意管道中不可编程的部分。这是硬件工程师和驱动程序程序员的权限


如果您希望对现有硬件进行大量控制,请尝试DX12或Vulkan/Metal。作为一名程序员,他们离硬件的距离是最近的,而无需编写自定义驱动程序。

Vulcan让你更接近GPU,如果你想更接近GPU,你必须与每个GPU供应商沟通,以获得驱动程序使用的低级接口(我怀疑你在这方面会取得多大成功)@如果你是一个图形编程的初学者,(现代)OpenGL将有很多年的时间,直到并且如果你的游戏引擎处于一种状态,它将从Vulkan提供给你的更低级的控制中获得任何优势。如果你真的想避免任何“图形API”,你可以在CUDA或OpenCL中实现计算,但是(1)性能可能会受到很大影响,(2)您仍然需要使用某种图形API才能将图像显示到屏幕上。Vulkan为您提供了比OpenGL低得多的硬件控制,但如果您还没有使用过这两种方法,我建议您先从OpenGL开始,如果您发现最新的OpenGL确实不足以满足您的需要,则只在以后过渡到Vulkan。另一方面,您可以走漫长的路,编写自己的驱动程序,自己的显卡接口等等-或者别的什么。。。我确信这是可能的,但我也确信这不值得尝试。我的目标不是制作一个能够呈现内容的应用程序,而是了解它是如何做到的。我想做渲染的所有数学运算。我用WinAPI在CPU上制作了一个渲染器,一直到在三角形上绘制纹理,但是速度非常慢,我用20 fps渲染了10000个纹理三角形,所以没有空间添加阴影,以及所有更高级的东西,我写了绘制三角形和纹理贴图的算法等等。@Mark:但你已经知道它是如何做到的;您在编写软件渲染器时证明了这一点。你知道图形是如何工作的。GPU适用于您希望图形快速工作的情况。这意味着生活在他们的限制之内。一旦您为三角形光栅器编写了代码,您就已经了解了有关三角形光栅器的所有知识。一旦编写了在三角形上插值参数的代码,就没有什么可学的了。让硬件完成它的工作,这样你就可以去做你自己的。@Mark:如果你是那种认为自己没有真正做/学习一件事情的人,除非他们完全从头开始实施,那么对你没有真正的帮助。没有中间立场;如果你想要“快速、可用”,那么你不能自己写。你必须使用硬件。既然你已经了解了光栅化器的工作原理,我不明白放弃软件光栅化器而使用硬件光栅化器有什么问题。你学会了他们要学的东西;你们还能得到什么?Blender(它曾经使用过OpenGL)据我所知,Blender仍然使用OpenGL。也就是说,至少用于呈现ui/编辑器/预览。渲染器本身不是光栅化器,而是光线跟踪器,但情况完全不同。请查看。应该很容易在你的机器上得到一个演示。与具有相同功能集的硬件渲染器相比,它确实在性能方面存在困难,但它仍然是一个非常令人印象深刻的演示,展示了在纯软件管道中可以实现的功能。