那么,我怎样才能以更好的方式绘制相似的几何图形......
就像@Ian Mallett 描述的那样;将所有顶点数据放入单个顶点缓冲区对象中。这使得一次调用即可呈现您的地图。如果您的地图变大 1000 倍,您可能希望实现一个仅绘制屏幕上显示的顶点的相机解决方案,但如果您计划绘制更大的地图,那么稍后会出现这个问题。
...以及如何仅将纹理的某个区域绑定到 VBO?
您只能绑定整个纹理。您必须指向要映射的纹理的某个区域。
每个纹理坐标都与一个特定的顶点相关。每个图块都与四个顶点有关。游戏中的常见图块将共享相同的纹理,因此称为“图块地图”。好好利用它。将所有瓷砖纹理放在纹理表中并绑定该纹理表。对于您创建的每个新“图块”,检查该区域是空气、草地还是地面,然后指向与您想要的纹理对应的部分。
假设您的纹理区域(以像素为单位)为 100x100。地面区域是从左下角算起的 15x15。按照上面的逻辑解释下面显示的示例代码:
// The vertexData array simply contains information
// about a tile's four vertices (or six
// vertices if you draw using GL_TRIANGLES).
mVertexBuffer.put(0, vertexData[0]);
mVertexBuffer.put(1, vertex[1]);
mVertexBuffer.put(2, vertex[2]);
mVertexBuffer.put(3, vertex[3]);
mVertexBuffer.put(4, vertex[4]);
mVertexBuffer.put(5, vertex[5]);
mVertexBuffer.put(6, vertex[6]);
mVertexBuffer.put(7, vertex[7]);
mVertexBuffer.put(8, vertex[8]);
mVertexBuffer.put(9, vertex[9]);
mVertexBuffer.put(10, vertex[10]);
mVertexBuffer.put(11, vertex[11]);
if (tileIsGround) {
mTextureCoordBuffer.put(0, 0.0f);
mTextureCoordBuffer.put(1, 0.0f);
mTextureCoordBuffer.put(2, 0.15f);
mTextureCoordBuffer.put(3, 0.0f);
mTextureCoordBuffer.put(4, 0.15f);
mTextureCoordBuffer.put(5, 0.15f);
mTextureCoordBuffer.put(6, 0.15f);
mTextureCoordBuffer.put(7, 0.0f);
} else { /* Other texture coordinates. */ }
您实际上编写了解决方案。唯一的区别是您应该将纹理坐标数据上传到 GPU。