我正在寻找关于OpenGL管道中的订单执行的澄清。我有两种设想。哪一个是正确的?或者如果两者都不是,那又是什么呢?
标准OpenGL管线:顶点着色器->基本体集合->几何着色器(可选)->栅格化->片段着色器->测试和混合
场景#1:(并行-并行)一个图形处理器核心(或几个)从开始到结束处理一个基元(3个顶点),而其他核心从头到尾处理其他基元(整个流水线并行)。
场景#2:(串联-并行)所有核心使用顶点着色器处理所有顶点,然后将数据存储在缓冲区中。然后,所有核心从该缓冲区组装原语,并将它们放入缓冲区。然后对栅格也是如此。那么碎片也是如此。然后混合到最终的帧缓冲区中。(所有核心和中间的缓冲区数据一次一个着色器)
我希望场景1是正确的,因为内存空间在我的应用程序中是关键的,而场景2似乎会使用更多的内存。
1条答案
按热度按时间jljoyd4f1#
像大多数图形API一样,OpenGL表示渲染某些东西的任何特定硬件机制的抽象。这样做的目的是为了让您可以对抽象进行编码,而不必“关心”您的代码在其上执行的特定硬件。
因此,根据定义,OpenGL不能规定GPU如何工作的基本原理。
而且,不同供应商的GPU运行方式也有所不同。您在很大程度上不应该关心这一点,因为除了少数例外,这些细节对应用程序的整体性能并不重要。
如果GPU要变换所有顶点,请将它们存储在缓冲区中,并在以后处理它们。它这么做是有原因的。它就是这样设计的,你不能改变它。