【问题标题】:Speed drawn using shaders使用着色器绘制的速度
【发布时间】:2013-01-03 11:40:47
【问题描述】:

当我使用时:

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

DrawCube() 函数在哪里:

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

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

【问题讨论】:

标签: opengl


【解决方案1】:

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

还可以查看 this 链接,该链接解释了固定流水线与可编程流水线。

【讨论】:

    【解决方案2】:

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

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

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


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

    【讨论】:

    • 非常感谢朋友。 :-)
    【解决方案3】:

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

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

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

    在实现着色器期间,您还必须检查所使用的着色器版本,因为许多功能在更高版本的 GLSL 实现中已被弃用。 参考文献:http://en.wikipedia.org/wiki/GLSL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多