2

我正在编写一个 iOS/Android 游戏,并寻找使用 OpenGL ES 2.0 呈现我的顶点数据的最高效方式。我有两种不同的数据:每帧都会改变其属性的动态数据,例如玩家或动画背景对象,以及静态数据,例如静态背景或地形。从昨天开始,我在谷歌上搜索了很多,但对于渲染此类数据最好的问题,我找不到一个明确而独特的答案。

渲染此类数据基本上有三个选项(如果我没有错过任何一个。如果是这样,请随时纠正我。):

仅限顶点数组: 只需在 CPU 上的每一帧填充顶点(包括动态数据)。

仅限顶点缓冲区对象: 使用 GL_DYNAMIC_DRAW 在 GPU 上分配 VBO,其中存储了动态和静态数据。然后通过 glBufferSubData 每帧更新动态数据。

两者都使用: 静态数据使用 VBO 存储和渲染,动态数据使用顶点数组渲染。使用此选项,我们需要两个渲染通道,一个用于渲染 VBO,一个用于渲染顶点数组。

由于第一个选项没有利用静态数据的不变性,并且第三个选项需要两次渲染通道,我的猜测是我应该使用第二个选项。但是,我对此完全不确定,希望您能澄清我的困惑。

4

1 回答 1

1

分配两个顶点缓冲区对象。一个带有GL_DYNAMIC_DRAW将经常更新的提示。为不可变数据分配第二个 VBO 并使用提示GL_STATIC_DRAW根据 API 文档,GL_STATIC_DRAW 应该用于“将被修改一次并多次使用”的数据;正是你需要的。

说到这里的两个渲染通道可能是对这个术语的误用:你所做的是在两个单独的绘图命令中渲染你的场景。由于绘图命令是异步运行的,因此这样做不会对性能造成任何影响。另一方面,第二个渲染通道是当您使用不同的设置对整个场景进行两次渲染(参见此处的示例)时,或者当您对先前渲染通道的输出进行一些图像处理效果时。

于 2013-09-11T07:07:31.160 回答