【问题标题】:OpenGL ES 2.0: Efficient Rendering of Static and Dynamic Vertex DataOpenGL ES 2.0:静态和动态顶点数据的高效渲染
【发布时间】:2013-09-15 00:52:24
【问题描述】:

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

渲染此类数据基本上有三种选择(如果我不错过任何一种。如果有,请随时纠正我。):

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

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

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

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

【问题讨论】:

  • AFAIK 手机中的主内存和视频内存在物理上是相同的。我以前只使用过android,但我发现顶点数组(动态)和VBO(缓冲/更多静态)速度没有区别。图形可能非常繁琐,而且在许多情况下不直观,因此花额外的时间编写一些简单的测试可以得到回报。如果可以的话,让 GPU 来做动画和改变你的数据:)

标签: graphics opengl-es vbo vertex-array


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多