您可以制作自己的渲染管线吗?
Can you make your own rendering pipeline?
我想写一个渲染器,但我真的必须使用 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。它们与程序员一样接近硬件,而无需编写自定义驱动程序。
- 没有为自己的结构调用列表推回方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 子轴围绕父轴而不是他自己的轴旋转
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 重载 + 自己的类和 std::string 的运算符
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 将矩阵乘以我自己的输入的向量
- 您应该在什么时候创建自己的异常类型
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- string1 == string2 和你自己的 for 循环比较有什么区别?
- 如何正确包含我自己的标头?
- 自己的自定义向量类. 内存重新分配
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何使用ZeroMQ为协议缓冲区编写自己的RPC实现