lwjgl 纹理多重绑定到一个 VBO

Posted

技术标签:

【中文标题】lwjgl 纹理多重绑定到一个 VBO【英文标题】:lwgl textures multiple binding to one VBO 【发布时间】:2014-03-04 05:08:48 【问题描述】:

我有一个数组(高度图)并且想要渲染它,但我希望每个“正方形”都有不同的纹理,我可以用一个 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);

【问题讨论】:

【参考方案1】:

好吧,我认为解决您的问题的最佳方法是使用纹理贴图并仍然使用完整的 VBO,而不是将其分成几部分。在一个图像上拥有多个图块也更快,因为绑定纹理需要很多资源。无论如何,尝试创建一个tilemap。纹理坐标将描述您的纹理。因此,例如,如果您有 4 个相同大小的不同纹理,您可以将它们全部放入一个大的 2x2 图像中。不,要将第一个纹理绑定到四边形,您可以使用纹理坐标 (0, 0) 到 (0.5, 0.5)。最后一个纹理将绑定在坐标 (0.5, 0.5) 到 (1.0, 1.0) 上。这是我现在想到的最好的方法。

【讨论】:

以上是关于lwjgl 纹理多重绑定到一个 VBO的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理

LWJGL VBO 三角形纹理坐标不起作用

Java - LWJGL 中的绑定纹理导致白屏

使用 glBufferSubData() 更新 VBO 数据

使用 OpenGL / LWJGL 绘制纹理四边形使用旧纹理

使用 VBO 的纹理绑定无法正常工作