【问题标题】:OpenGL glBegin vs Vertex Buffer Arrays VBOOpenGL glBegin 与顶点缓冲区数组 VBO
【发布时间】:2012-08-08 03:31:22
【问题描述】:

我想制作一个 OpenGL 游戏,但现在意识到我在学校学到的东西 -> 直接通过 glBegin/glEnd 绘制对象 -> 是老派而且很糟糕。在互联网上阅读我看到 Vertex Buffer Objects 和 GLSL 是 3d 编程的“正确”方法。

1)我应该使用OpenGL的glDrawArrays还是glDrawElements?

2) 对于一个有很多实体/地面/物体的游戏,渲染函数必须是很多glDrawArrays():

foreach(entity in entities):
    glDrawArrays(entitiy->arrayFromMesh()) //Where we get an array of the mesh vertex points

或者只有一个 glDrawArrays() 封装了每个实体:

glDrawArrays(map->arrayFromAllMeshes())

3) 现在是否每个图形层(例如 DirectX)都标准化了顶点缓冲区对象?

【问题讨论】:

  • 从技术上讲,它并不“坏”——只是老派。虽然我所有的数据都是用 glDrawArrays/glDrawElements 绘制的,但如果我只需要测试一些东西,我不想去生成 VBO 并将数据映射到其中的编程开销——只需使用即时模式进行小型测试。
  • @IanMallett:这取决于你对坏的定义。它已经过时了,它已被弃用,甚至不受 opengl ES、WebGL 或任何体面的核心配置文件上下文的支持。
  • OpenGL ES 1.1 支持它(就像 OpenGL 2 一样),而 WebGL 甚至不支持 anything 的客户端数组。不过我同意,在现代代码中应该避免使用它,因为它已被弃用。

标签: c++ opengl


【解决方案1】:

1) 我应该使用 OpenGL 的 glDrawArrays 还是 glDrawElements?

这取决于您的源数据是什么样的。 glDrawArrays 稍微简单一点,因为您只需要绘制一个顶点流,但glDrawElements 在您有许多顶点由多个三角形共享的情况下很有用。如果您只是绘制精灵,那么glDrawArrays 可能是最简单的,但glDrawElements 对于您想要节省缓冲区空间的大型复杂网格很有用。

2) 对于有很多实体/地面/对象的游戏,渲染函数必须是多个 glDrawArrays() 还是只有一个 glDrawArrays() 封装了每个实体:

同样,这在某种程度上是可选的,但请注意,您不能在 drawarrays 调用中间更改程序状态。所以这意味着任何两个需要不同状态的对象(不同的纹理、不同的着色器、不同的混合设置)都必须有一个单独的绘制调用。但是,有时将尽可能多的相似事物分组到一个绘图调用中可能有助于提高性能。

3) 现在是否每个图形层(例如 DirectX)都标准化了顶点缓冲区对象?

DirectX 确实有类似的概念,是的。

【讨论】:

  • 我认为 post-transform cache 通常只会受到索引渲染的影响,因此使用 drawElementsdrawArrays 不仅可以改善空间,还可能会提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多