C++ 2D游戏中所有精灵的VBO相同吗?

C++ 2D游戏中所有精灵的VBO相同吗?,c++,opengl,2d,game-engine,vbo,C++,Opengl,2d,Game Engine,Vbo,我在C++和OpenGL 3.3中编写了一个小型的2D游戏引擎(教育目的),在编写代码时,我注意到几乎所有精灵(如果不是全部)使用相同的顶点缓冲值: 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 } 即在模型空间中形成正方形的两个三角形(如果使用VBO

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

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
}
即在模型空间中形成正方形的两个三角形(如果使用VBO索引),indexBuffer如下所示:

const unsigned short indexBuffer[] = { 0, 1, 2, 2, 0, 3 }
为什么我对所有精灵使用相同的模型空间值?我对所有这些都使用不同的MVP矩阵:

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

    glm::mat4 model = <translate> * <rotate> * <scale>
    
    glm::mat4模型=**
    
其中:

  • 是精灵在屏幕空间中的位置
  • 精灵的旋转
  • 精灵的大小(以像素为单位)除以2。为什么?模型空间的每个角点对应一个顶点,由这些顶点形成的正方形的中心位于原点,因此,如果我们的精灵是250x250像素,我们在每个轴的每侧按125px缩放,从而将模型空间正方形转换为屏幕空间正方形
因此,如果我有5个精灵,我将调用
gldrawerelements
5次,每次调用的MVP和纹理不同,但顶点缓冲区、索引缓冲区和UV坐标相同


您认为这是一种在将来使用时容易出错的方法吗?或者我应该在创建顶点时直接将
变换应用于顶点吗?并且只保留模型矩阵的旋转。

我发现如果我在cpu上进行mvp计算,然后上传顶点数据,我最终不必保存任何矩阵,如果它们共享相同的纹理,我可以一次绘制多个精灵。当然,无论如何你都需要存储不同的纹理坐标。@Ben,但是为什么要用CPU用MVP矩阵变换每个顶点,而在着色器中可以更快地完成呢?你不必上传一大堆矩阵数据。此外,您还必须缓冲一堆纹理坐标。我想这取决于你,但我发现上传顶点数据更快。这可能会有帮助:@Ben Woaw这是一个很好的阅读,谢谢你的链接。这是一个小的改进,但是你可以通过使用GL_三角形_扇来绘制四边形来完全消除索引缓冲区。