0

当我使用:

glUseProgramObjectARB(program);
  DrawCube();
glUseProgramObjectARB(0);

其中函数 DrawCube() 是:

DrawCube(){
  glBegin(GL_QUADS);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
    glVertex3f(... data ...);
  glEnd();
}

我的问题是:这个功能是在显卡上执行的吗?如果我使用直接模式 [glBegin() - glEnd()] 还是使用 VBO 会更快吗?

4

3 回答 3

3

尽管链接中的测试表明使用固定模式与可编程模式没有明显的性能差异,但我必须说我没有“购买”它。测试人员没有显示他的基准源代码。我怀疑他的可编程测试是不够“干净”。我只能从我的个人经验中说。我有一个用旧(GL 2.1)编写的旧引擎,然后我们将其重写为 GL4.2 完全可编程的管道。我们很清楚,至少 80% 的性能boost 并且在某些模块中,例如屏幕外 FBO 渲染,我们获得了 300% 的性能提升。而且我什至没有触及效果和后期处理的东西,其中大部分实际上是缓慢的,或者如果不使用可编程管道是不可能的。

另请查看链接,该链接解释了固定与可编程管道。

于 2013-01-20T09:58:32.197 回答
2

着色器的使用和用于发送几何图形的方法是正交的,即一件事与另一件事无关。

即时模式的最大问题是,它会占用你的 CPU,因为所有这些小调用都会通过大量代码上下波动。第二个问题是,即时模式和客户端顶点阵列都受到系统总线带宽的限制。用数字表示:具有 16 个通道的 PCI-Express Gen 3 可以传输大约 15GiB/s(在实际应用中它更像是 10GiB/s)。GPU 内存连接的带宽至少是其 10 倍。通过使用 VBO^1,您可以让 GPU 通过仅发送几个字节(无论 glDrawElements 命令转换成什么)来绘制大量几何图形。

着色器 OTOH 是在 GPU 上执行的小程序,可将几何数据转换为屏幕位置并用像素值填充它们。着色器不关心数据以哪种方式发送到 GPU。同样“不使用”着色器并不意味着事情不会在 GPU 上发生。一方面,有原位编写的默认着色器以匹配配置的固定功能状态。即使不是这样,是什么让你认为不使用着色器会使 GPU 上的东西消失?


[1] 顶点数组对象只是抽象状态持有者,收集一组 VBO 以及它们绑定到哪些顶点属性。

于 2013-01-20T12:09:21.827 回答
-1

现在,大多数图形管道中都删除了 OpenGL 固定管道。一切都是用着色器完成的。为了保持兼容性,GL 驱动程序会生成一个模拟固定功能的着色器。

如果你想获得性能提升,你必须使用带有着色器的 VAO、VBO 并执行你自己的数学。有很多数学库与新版本的 GLSL 实现兼容。示例: http: //glm.g-truc.net/

VBO 用于将原始数据从计算机内存复制到 GPU 内存。VAO 是 VBO 的集合,可以使用一个 VAO 调用来实现。

同样在着色器的实现过程中,您必须检查所使用的着色器版本,因为许多功能在更高版本的 GLSL 实现中已被弃用。参考资料:http ://en.wikipedia.org/wiki/GLSL

于 2013-05-31T15:05:14.910 回答