我正在学习OpenGL,并希望能够从精灵表中绘制一些精灵到屏幕上。我不确定自己是否正在正确操作。
我的目标是像Terraria一样通过瓷砖来构建世界。这意味着我所有用来构建世界的瓷砖都是1x1,但是我可能会在以后添加像2x1、1x2、2x2等实体。
我现在所做的是创建一个名为"Tile"的类,其中包含这个瓷砖的变换矩阵和指向其缓冲区的指针。非常简单:
我的目标是像Terraria一样通过瓷砖来构建世界。这意味着我所有用来构建世界的瓷砖都是1x1,但是我可能会在以后添加像2x1、1x2、2x2等实体。
我现在所做的是创建一个名为"Tile"的类,其中包含这个瓷砖的变换矩阵和指向其缓冲区的指针。非常简单:
Tile::Tile(glm::vec2 position, GLuint* vbo)
{
transformMatrix = glm::translate(transformMatrix, glm::vec3(position, 0.0f));
buffer = vbo;
}
当我绘制瓦片时,只需绑定缓冲区并更新着色器的UV坐标和顶点位置。之后,我将瓦片的变换矩阵传递给着色器,并使用glDrawElements进行绘制:
glEnableVertexAttribArray(positionAttrib);
glEnableVertexAttribArray(textureAttrib);
for(int i = 0; i < 5; i++)
{
glBindBuffer(GL_ARRAY_BUFFER, *tiles[i].buffer);
glVertexAttribPointer(positionAttrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0);
glVertexAttribPointer(textureAttrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
glUniformMatrix4fv(transformMatrixLoc, 1, GL_FALSE, value_ptr(tiles[i].transformMatrix));
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);
}
glDisableVertexAttribArray(positionAttrib);
glDisableVertexAttribArray(textureAttrib);
我能更高效地完成这个任务吗?我正在考虑为1x1的图块设置一个缓冲区,2x1的图块设置另一个缓冲区等等,并且只需要让Tile类包含UVpos和UVsize,然后将它们发送到着色器中,但我不确定该如何实现。
我认为使用一个缓冲区处理1x1和另一个处理2x1听起来会更快。