Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在OpenGL ES 2中实现VBOs渲染精灵_Android_Opengl Es 2.0_Vbo - Fatal编程技术网

Android 在OpenGL ES 2中实现VBOs渲染精灵

Android 在OpenGL ES 2中实现VBOs渲染精灵,android,opengl-es-2.0,vbo,Android,Opengl Es 2.0,Vbo,我正在尝试在OpenGL中实现VBOs以提高渲染速度,虽然我理解总体概念,但我不确定如何在2D中使用精灵实现。我发现的所有实现似乎都是为了绘制一个三维模型,其中所有顶点都是相对固定的。然而,在2D游戏中,每个精灵都有自己的位置,因此也有自己的MVP矩阵 这似乎是如何做到的: Basic vertex shader: "uniform mat4 uMVPMatrix; \n" + "attribute vec4 vPosition;" + "a

我正在尝试在OpenGL中实现VBOs以提高渲染速度,虽然我理解总体概念,但我不确定如何在2D中使用精灵实现。我发现的所有实现似乎都是为了绘制一个三维模型,其中所有顶点都是相对固定的。然而,在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

两种可能的想法:

  • 将顶点加载到VBOs中,但绘制每个精灵,如上所述加载每个精灵的MVP矩阵。唯一可以节省的是,您不必每次都传入顶点数据,但仍然需要调用glvertexattributepointer来索引每个精灵在VBO中的正确位置。我想节省的速度将是最小的

  • 将MVP矩阵定义为一个属性,而不是将其作为一个统一的矩阵。将每个精灵的所有MVP连接到一个大数组中,并使用glVertexAttributePointer加载它。似乎不可能使用glVertexAttribPointer一次加载一个矩阵(您最多可以在vec4中加载),因此我必须通过4个连续调用逐列加载它。然后我应该能够独立地变换每个精灵。与我当前的实现相比,应该会有相当大的速度提升,尽管连接MVP仍然需要时间

  • 是否有比上述更简单的实现?我想一定有一些“标准”的方法来做这件事,比如批量绘制精灵

    编辑


    我决定使用选项2,但在开始工作时遇到了问题:

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


    编辑:您也可以有一种特定类型的节点,通常称为atlas,您可以在其中添加只受节点模型矩阵影响的预计算四边形(请参见或)。

    我可能会进一步研究这一点,但目前我决定在上面的帖子中采用选项2,从我目前的情况来看,这似乎是一个相当直接的进展。然而,正如我在编辑的文章中解释的那样,我遇到了问题。最好在这里发布一个新问题,并留下一个指向其他问题的链接。