1

我正在尝试实现 VBO 以提高 OpenGL 中的渲染速度,虽然我了解整体概念,但我不确定如何在 2D 中实现精灵。我发现的所有实现似乎都是用于绘制所有顶点相对于彼此固定的 3D 模型。然而,在 2D 游戏中,每个精灵都有自己的位置,因此也有自己的 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 中,但要绘制每个精灵,如上加载每个精灵的 MVP 矩阵。唯一的节省是您不必每次都传入顶点数据,但您仍然需要调用 glVertexAttribPointer 来索引每个精灵在 VBO 中的正确位置。我想速度节省将是最小的。

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

有没有比上面更简单的实现?我想必须有一些“标准”的方式来作为批量绘制精灵。

编辑

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

4

1 回答 1

2

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

编辑:您也可以拥有特定类型的节点,通常称为 atlas,您可以在其中添加仅受节点模型矩阵影响的预计算四边形(请参阅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)。

于 2012-12-14T19:36:48.810 回答