同样的VBO适用于2D游戏中的所有精灵?

时间:2014-03-17 02:58:14

标签: c++ opengl 2d game-engine vbo

我正在用C ++和OpenGL 3.3编写一个小型2D游戏引擎(教育目的),同时编写我注意到的代码,几乎所有精灵(如果不是全部)都使用相同的vertexBuffer值:

const float vertexBuffer[] =
{
    -1.0f, -1.0f, 0.0f, 1.0f,
    -1.0f, 1.0f, 0.0f, 1.0f,
    1.0f, 1.0f, 0.0f, 1.0f,
    1.0f, -1.0f, 0.0f, 1.0f
}

这是形成正方形的模型空间中的2个三角形(如果使用VBO索引),indexBuffer如下:

const unsigned short indexBuffer[] = { 0, 1, 2, 2, 0, 3 }

为什么我为所有精灵使用相同的模型空间值?我为所有这些使用不同的MVP矩阵:

  • P(投影):正交相机变换,通常与glContext的宽度和高度相同。
  • V(视图):一个lookAt转换,它只是坐在z轴上,看着xy平面垂直。这也用于移动相机(跟随播放器等)。
  • M(模型):使用属于每个精灵的变换创建此矩阵:

    glm::mat4 model = <translate> * <rotate> * <scale>
    

其中:

  • <translate>是精灵在屏幕空间中的位置
  • <rotate>精灵的旋转
  • <scale>精灵的大小(以像素为单位)除以2.为什么?模型空间的每个角对应一个顶点,由这些顶点形成的正方形,其中心位于原点,所以如果我们的精灵是250x250像素,我们将每个轴的每边缩放125px,从而改变我们的模型空间广场到屏幕空间广场。

所以,如果我有5个精灵,我将调用glDrawElements 5次,每次使用不同的MVP和纹理,但是相同的vertexBuffer,indexBuffer和uvCoordinates。

您认为这是一种容易出错的方法吗?或者我应该在创建顶点时直接将<translate><scale>转换应用于顶点?只留下旋转的模型矩阵。

0 个答案:

没有答案