我现在正在学习 OpenGL,我想从精灵表中将一些精灵绘制到屏幕上。我注意到我是否以正确的方式这样做。
我想做的是用泰拉瑞亚的瓷砖建造一个世界。这意味着构建我的世界的所有图块都是 1x1,但我以后可能想要一些东西,比如 2x1、1x2、2x2 等实体。
我现在要做的是,我有一个名为“Tile”的类,其中包含 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 的缓冲区所描述的听起来会快很多。