lwgl tekstur banyak pengikatan ke satu VBO

Saya memiliki array (peta tinggi) dan ingin merendernya tetapi saya ingin tekstur berbeda untuk setiap "persegi", dapatkah saya melakukannya dengan satu VBO untuk simpul dan VBO kedua untuk tekstur?

Merupakan ide bagus untuk membagi array itu menjadi beberapa bagian yang lebih kecil. ukuran apa yang terbaik? Saya membaca di suatu tempat 32*32?, atau 16*16 seperti Minecraft?

Saya ingin saya dapat mengubah ketinggian dalam array, saat program dijalankan dan render berubah, apa yang harus saya lakukan?

Ini adalah bagian dari program saya:

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);

person Jakub    schedule 04.03.2014    source sumber


Jawaban (1)


Menurut saya, cara terbaik untuk menyelesaikan masalah Anda adalah dengan menggunakan peta tekstur dan tetap menggunakan VBO lengkap, tanpa membaginya menjadi beberapa bagian. Memiliki banyak ubin pada satu gambar juga lebih cepat, karena mengikat suatu tekstur memerlukan banyak sumber daya. Bagaimanapun, cobalah membuat peta ubin. Koordinat tekstur akan menggambarkan tekstur Anda. Jadi misalnya jika Anda memiliki 4 tekstur berbeda dengan ukuran yang sama, Anda dapat memasukkan semuanya ke dalam satu gambar besar berukuran 2x2. Tidak, untuk mengikat tekstur pertama ke segi empat, Anda dapat menggunakan koordinat tekstur (0, 0) hingga (0,5, 0,5). Tekstur terakhir akan terikat pada koordinat (0.5, 0.5) hingga (1.0, 1.0). Itu adalah cara terbaik yang terlintas dalam pikiran saya saat ini.

person uwap    schedule 18.04.2014