我有一个数组(高度图),想要渲染它,但我想为每个“方形”设置不同的纹理,我可以用一个VBO作为顶点,第二个VBO纹理吗?
最好将该数组拆分成更小的部分。 什么尺寸最好?我读过32 * 32?或16 * 16的地方,像Minecraft?
我想我可以在数组中更改高度,而程序运行和渲染更改,我必须做什么?
以下是我的计划的一部分:
amountOfVertices = 6 * (data.length - 1) * (data[0].length - 1);
vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
for (int z = 0; z < data.length - 1; z++) {
for (int x = 0; x < data[z].length-1; x++) {
vertexData.put(new float[] { x, data[z+1][x], z+1, }); // Vertex
vertexData.put(new float[] { x+1, data[z+1][x+1], z+1, }); // Vertex
vertexData.put(new float[] { x+1, data[z][x+1], z, }); // Vertex
vertexData.put(new float[] { x+1, data[z][x+1], z, }); // Vertex
vertexData.put(new float[] { x, data[z][x], z, }); // Vertex
vertexData.put(new float[] { x, data[z+1][x], z+1, }); // Vertex
}
}
vertexData.flip();
textureData = BufferUtils.createFloatBuffer(amountOfVertices * texSize);
for (int z = 0; z < data.length - 1; z++) {
for (int x = 0; x < data[z].length-1; x++) {
textureData.put(new float[] { 1f, 1f, }); // Texture Coordinate
textureData.put(new float[] { 1f, 0f, }); // Texture Coordinate
textureData.put(new float[] { 0f, 0f, }); // Texture Coordinate
textureData.put(new float[] { 0f, 0f, }); // Texture Coordinate
textureData.put(new float[] { 0f, 1f, }); // Texture Coordinate
textureData.put(new float[] { 1f, 1f, }); // Texture Coordinate
}
}
textureData.flip();
glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
stone.bind();//bind a texture
vboVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vboTexCoordHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboTexCoordHandle);
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
答案 0 :(得分:0)
嗯,我认为解决问题的最佳方法是使用纹理贴图并仍然使用完整的VBO,而不将其分成几部分。在一个图像上具有多个图块也更快,因为绑定纹理需要许多资源。无论如何,尝试创建一个tilemap。然后纹理坐标将描述您的纹理。因此,例如,如果您有4个相同大小的不同纹理,则可以将它们全部放入一个大的2x2图像中。不,要将第一个纹理绑定到四边形,可以使用纹理坐标(0,0)到(0.5,0.5)。最后一个纹理将绑定在坐标(0.5,0.5)到(1.0,1.0)上。这是我现在想到的最佳方式。