У меня есть массив (карта высот), и я хочу его отобразить, но мне нужна разная текстура для каждого «квадрата». Могу ли я сделать это с одним VBO для вершин и вторым VBO для текстуры?
Хорошая идея разделить этот массив на более мелкие части. какой размер лучше? Где-то читал 32*32?, или 16*16 как в Майнкрафте?
Я хочу, чтобы я мог изменять высоту в массиве во время запуска программы и изменения рендеринга, что я должен сделать?
Вот часть моей программы:
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);