使用OpenGL ES 2.0移动基元(三角形/矩形)

时间:2014-03-06 20:50:05

标签: android opengl-es-2.0

我想用OpenGL ES 2.0创建一些简单的tetris克隆用于教育目的。到目前为止,我设法在屏幕上绘制一个由两个三角形组成的简单矩形。

我想用那些原始的矩形作为我的俄罗斯方块块 现在,我的问题是如何移动这些矩形,因为它们应该像俄罗斯方块一样掉下来。

这是我定义矩形的方式:

...
public Rectangle()
{
    _vertices = new float[] 
    {
      // x, y, z
      // R, G, B, A

      -1.0f, 1.0f, 0.0f,
      1.0f, 0.0f, 0.0f, 1.0f,

      -1.0f, -1.0f, 0.0f,
      0.0f, 1.0f, 0.0f, 1.0f,

      1.0f, 1.0f, 0.0f,
      0.0f, 0.0f, 1.0f, 1.0f,

      -1.0f, -1.0f, 0.0f,
      1.0f, 0.0f, 0.0f, 1.0f,

      1.0f, -1.0f, 0.0f,
      0.0f, 1.0f, 0.0f, 1.0f,

      1.0f, 1.0f, 0.0f,
      0.0f, 0.0f, 1.0f, 1.0f
    };

    InitBuffer();
}
...

这是绘制矩形的代码:

private void drawRectangle(final FloatBuffer aRectangleBuffer)
{
    aRectangleBuffer.position(mPositionOffset);

    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
     mStrideBytes, aRectangleBuffer);

    GLES20.glEnableVertexAttribArray(mPositionHandle);


    aRectangleBuffer.position(mColorOffset);
    GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false,
     mStrideBytes, aRectangleBuffer);

    GLES20.glEnableVertexAttribArray(mColorHandle);

    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
}

代码基本上是从本教程复制的:Learn OpenGL ES - Android Lesson One: Getting Started

移动我想到的矩形的唯一方法是更改​​_vertices - 数组中的顶点。但这意味着要在每次抽奖中创建一个新阵列,一个新的VertexBuffer等,我不认为这是可行的方法。

也许这是一个转储问题,但是虽然我已经开始了解OpenGL ES是如何工作的,但这个我还没想到。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题。哪种方式最好取决于您的目标。由于您正在编写的游戏在GPU方面相对要求不高,因此从简单的事情开始是有意义的。

在您引用的示例中,每个顶点都乘以u_MVPMatrix。如果在每次绘制调用之前使用位置更新矩阵,则可以使用同一组顶点在屏幕上的任何位置绘制形状(并更改其比例,并旋转它,以及所有其他花哨的东西矩阵可以让您这样做) 。这是Android Breakout和部分Grafika使用的方法(例如参见“硬件规模练习器”)。

如果你达到了这种方法效率不高的程度,可能是时候研究游戏引擎(也许cocos2d-x?)而不是重新发明纹理映射轮。