我正在用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>
转换应用于顶点?只留下旋转的模型矩阵。