哪些OpenGL函数不是GPU加速?

我很震惊,当我读这个(从OpenGL wiki):

glTranslate, glRotate, glScale

Are these hardware accelerated?

No, there are no known GPUs that
execute this. The driver computes the
matrix on the CPU and uploads it to
the GPU.

All the other matrix operations are
done on the CPU as well :
glPushMatrix, glPopMatrix,
glLoadIdentity, glFrustum, glOrtho.

This is the reason why these functions
are considered deprecated in GL 3.0.
You should have your own math library,
build your own matrix, upload your
matrix to the shader.

对于非常长的时间,我认为大多数OpenGL函数使用GPU来进行计算。我不知道这是否是一个常见的误解,但经过一段时间的思考,这是有道理的。由于太多的状态切换,旧的OpenGL函数(2.x和更旧版本)真的不适合现实世界的应用程序。

这让我意识到,可能,许多OpenGL函数根本不使用GPU。

所以,问题是:

哪些OpenGL函数调用不使用GPU?

我相信知道上面的问题的答案将有助于我成为一个更好的程序员与OpenGL。请分享您的一些见解。

编辑:

我知道这个问题很容易导致优化水平。这是好的,但这不是这个问题的意图。

如果有人知道一些GL功能在某个流行的实现(如AshleysBrain建议,nVidia / ATI,并且可能依赖于操作系统),不使用GPU,这就是我的!

似乎可靠的优化指南后来。让我们专注于这个主题的功能。

编辑2:

这个主题不是关于矩阵转换如何工作。有other topics

男孩,这是一个大主题。

首先,我将从明显的开始:由于你从CPU调用函数(任何函数),它必须至少部分地运行在CPU上。所以问题的确是,在CPU上做了多少工作,在GPU上做了多少。

其次,为了使GPU执行一些命令,CPU必须准备要传递的命令描述。这里的最小集合是描述要做什么的命令令牌,以及要执行的操作的数据。 CPU如何触发GPU来执行命令也有些重要。因为大多数时候,这是昂贵的,CPU不经常这样做,而是在命令缓冲区中批量命令,并且简单地发送用于GPU处理的整个缓冲器。

所有这一切说,把工作传递到GPU不是一个免费的练习。这个成本必须针对在CPU上运行的功能(无论我们在说什么)。

退一步,你必须问自己为什么你需要一个GPU。事实是,一个纯粹的CPU实现做的工作(AshleysBrain提到)。 GPU的强大之处在于它的设计来处理:

>专门任务(光栅化,混合,纹理过滤,blitting,…)
>大量并行工作负载(DeadMG指向他的答案中),当一个CPU被设计为处理单线程工作。

这些是指导原则,以便决定什么进入芯片。任何可以受益于那些应该在GPU上运行的东西。任何其他都应该在CPU上。

这很有趣,顺便说一句。 GL的一些功能(在弃用之前,大多数)实际上没有清楚地描绘。显示列表可能是此类功能的最佳示例。每个驱动程序可以随意地从显示列表流推送到GPU(通常以一些命令缓冲区形式),以供稍后执行,只要保持GL显示列表的语义(并且这有点困难一般)。因此,一些实现仅选择将显示列表中的调用的有限子集推送到计算格式,并且选择在CPU上简单地重放剩余的命令流。

选择是另一个不清楚是否有价值在GPU上执行。

最后,我不得不说,一般来说,API调用和CPU或GPU上的工作量之间几乎没有相关性。状态设置API倾向于仅修改驱动程序数据中某处的结构。它的效果只有当一个绘制,或一些这样的调用时可见。

很多GL API的工作原理。在这一点上,询问glEnable(GL_BLEND)是否在CPU或GPU上执行是相当无意义的。重要的是当调用Draw时,混合是否会发生在GPU上。所以,在这个意义上,大多数GL入口点不加速。

我也可以扩展一点数据传输,但Danvil触及它。

我将完成与小的“s / w路径”。从历史上看,GL不得不工作到规格,无论什么硬件特殊情况。这意味着如果h / w不处理特定的GL特性,那么它必须模拟它,或者在软件中完全实现它。有很多情况下,但一个打击了很多人是当GLSL开始出现。

由于没有实际的方法来估计GLSL着色器的代码大小,因此决定GL应该将任何着色器长度视为有效。这意味着相当清楚:实现h / w可以采用任意长度着色器 – 在当时是不现实的 – 或者实现s / w着色器模拟(或者,如一些供应商选择,不能符合)。所以,如果你在片段着色器上触发了这个条件,你的整个GL结束了在CPU上执行,即使你有一个GPU处于空闲状态,至少对于那个绘制。

翻译自:https://stackoverflow.com/questions/2713417/which-opengl-functions-are-not-gpu-accelerated

转载注明原文:哪些OpenGL函数不是GPU加速?