使用着色器绘制的速度

时间:2013-01-20 03:10:22

标签: opengl

当我使用时:

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

其中函数DrawCube()是:

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

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

3 个答案:

答案 0 :(得分:3)

虽然this链接中的测试显示使用固定模式与可编程没有明显的性能差异,但我必须说我不“买”它。测试人员没有显示他的基准源代码。我怀疑他的可编程测试不够“干净”。我可以根据我的个人经验说。我有一个用旧的(GL 2.1)编写的旧引擎,然后我们将其重写为GL4。 2个完全可编程的管道。我们明白了,至少有80%的性能提升,在某些模块中,如屏幕外FBO渲染我们获得了300%的性能提升。我甚至没有触及效果和后期处理的东西,其中大多数都是缓慢的de - 如果没有使用可编程管道,也可能是不可能的。

另请参阅解释固定与可编程管道的this链接。

答案 1 :(得分:2)

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

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

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


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

答案 2 :(得分:-1)

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

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

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

在着色器的实现过程中,你必须检查所使用的shadres版本,因为在更高版本的GLSL实现中不推荐使用许多函数。 参考文献:http://en.wikipedia.org/wiki/GLSL