android - 实现 VBO 以在 OpenGL ES 2 中渲染 Sprite

标签 android opengl-es-2.0 vbo

我正在尝试实现 VBO 以提高 OpenGL 中的渲染速度,虽然我了解总体概念,但我不确定如何在 2D 中使用 Sprite 实现。我发现的所有实现似乎都是为了绘制一个 3D 模型,其中所有顶点都相对于彼此固定。然而,在 2D 游戏中,每个 Sprite 都有自己的位置,因此也有自己的 MVP 矩阵。

它是如何完成的:

Basic vertex shader:
        "uniform mat4 uMVPMatrix;   \n" +

        "attribute vec4 vPosition;" +
        "attribute vec2 texCoord;" +
        "varying vec2 vTexCoord;" +
        "void main() {" +

        // matrix must be included as part of gl_Position
        "  gl_Position = uMVPMatrix * vPosition;" +
        "  vTexCoord = texCoord;" +
        "}";

Drawing with VBOs (pseudocode)
     1. Bind vertex/texture buffers
     2. Load MVP matrix with glUniformMatrix4fv
     3. Call glDrawArrays/glDrawElements to draw the all the vertices in one call

是否有一种简单的方法来扩展上述方法以允许不断变化的 MVP?

两种可能的想法:

  1. 将顶点加载到 VBO 中,但绘制每个 Sprite ,如上所述加载每个 Sprite 的 MVP 矩阵。唯一的保存是你不必每次都传递顶点数据,但你仍然需要调用 glVertexAttribPointer 来为每个 Sprite 索引到 VBO 中的正确位置。我想节省的速度会很小。

  2. 与其将 MVP 矩阵作为统一矩阵,不如将其定义为属性。将每个 Sprite 的所有 MVP 连接成一个大数组,并使用 glVertexAttribPointer 加载它。使用 glVertexAttribPointer 一次加载矩阵似乎是不可能的(你最多可以加载一个 vec4),所以我必须通过 4 次连续调用逐列加载它。然后我应该能够独立地转换每个 Sprite 。与我当前的实现相比,应该会有相当大的速度改进,但连接 MVP 仍然需要时间。

有比上面更简单的实现吗?我想必须有一些“标准”的方式来做批量绘图 Sprite 。

编辑

我决定使用选项 2,但是我在开始工作时遇到了问题:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)

最佳答案

常见的 2d 引擎所做的是提供基于树的渲染。一个节点有它的模型矩阵,并且有一些子节点同时受父模型矩阵和它们自己的矩阵的影响。在运行时访问每个节点并渲染它,将父矩阵和自己的矩阵连接成一个矩阵。除非你正在渲染数千个节点( Sprite ),否则你不应该担心将如此多的矩阵传递到驱动程序内存中的性能问题。

编辑:您还可以拥有特定类型的节点,通常称为图集,您可以向其中添加仅受节点模型矩阵影响的预计算四边形(请参阅 https://github.com/cocos2d/cocos2d-iphone/blob/master-v2/cocos2d/CCAtlasNode.mhttps://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core2d/QuadAtlas.java)。

关于android - 实现 VBO 以在 OpenGL ES 2 中渲染 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881269/

相关文章:

c++ - 绘制VBO导致段错误

android - 在测验应用程序 android 的结果(错误答案问题)中显示正确答案

opengl-es - 顶点万花筒着色器

java - glCreateShader 和 glCreateProgram 在 android 上失败

opengl-es-2.0 - opengl纹理映射偏离5-8像素

c++ - 使用 OpenGL VBO 绘制数千个多边形

python - glBufferSubData 不起作用,不显示错误

android - aSmack,如何强制重新连接?

Android:Retrofit/Volley 是如何优于 AsyncTask 的

java - Android 中的 LibGDX 屏幕支持尺寸