0

我想制作一个 OpenGL 游戏,但现在意识到我在学校学到的东西 -> 直接通过 glBegin/glEnd 绘制对象 -> 是老派而且很糟糕。互联网上的读数我看到顶点缓冲区对象和 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)都标准化了顶点缓冲区对象?

4

1 回答 1

3

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

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

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

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

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

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

于 2012-08-10T20:07:18.167 回答