พื้นผิว lwgl เชื่อมโยงหลายรายการกับ VBO เดียว

ฉันมีอาร์เรย์ (แผนที่ความสูง) และต้องการเรนเดอร์ แต่ฉันต้องการพื้นผิวที่แตกต่างกันสำหรับ "สี่เหลี่ยมจัตุรัส" แต่ละอัน ฉันสามารถทำมันด้วย 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);

person Jakub    schedule 04.03.2014    source แหล่งที่มา


คำตอบ (1)


ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหาของคุณคือการใช้แผนที่พื้นผิวและยังคงใช้ VBO ที่สมบูรณ์โดยไม่แบ่งออกเป็นส่วนๆ การมีไทล์หลายไทล์ในรูปภาพเดียวก็เร็วขึ้นเช่นกัน เนื่องจากการผูกพื้นผิวต้องใช้ทรัพยากรจำนวนมาก ยังไงก็ตาม ลองสร้าง Tilemap ดูครับ พิกัดพื้นผิวจะอธิบายพื้นผิวของคุณ ตัวอย่างเช่น หากคุณมีพื้นผิวที่แตกต่างกัน 4 ชิ้นที่มีขนาดเท่ากัน คุณสามารถรวมพื้นผิวทั้งหมดเป็นภาพขนาด 2x2 ขนาดใหญ่ภาพเดียวได้ ไม่ หากต้องการผูกพื้นผิวแรกเข้ากับรูปสี่เหลี่ยม คุณสามารถใช้พิกัดพื้นผิว (0, 0) ถึง (0.5, 0.5) พื้นผิวสุดท้ายจะถูกผูกไว้ที่พิกัด (0.5, 0.5) ถึง (1.0, 1.0) มันเป็นวิธีที่ดีที่สุดที่อยู่ในใจของฉันตอนนี้

person uwap    schedule 18.04.2014