glBufferSubData导致缓冲区填充零

时间:2012-12-29 19:33:13

标签: java opengl lwjgl

我正在制作一个使用lwjgl动态渲染文本的系统。我有一个系统设置自动生成一个纹理,用于渲染,图像确实有效。这就是问题所在。
我有这个代码来初始化2个VBO和一个VAO,两者都被设置为能够处理1024个文本字符的数据。

vbo = GL15.glGenBuffers(); //Main VBO to hold data
vao = GL30.glGenVertexArrays();

GL30.glBindVertexArray(vao);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0); //Position
GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 36, 12); //Color
GL20.glVertexAttribPointer(3, 2, GL11.GL_FLOAT, false, 36, 28); //Texture Coordinates
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);

indvbo = GL15.glGenBuffers(); //VBO to hold indices
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

我尝试使用此代码更新vbo中的数据

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
dataBuffer.clear();
for(Vertex vert : vertices) { //Vertex is a custom class to hold vertex data.
    dataBuffer.put(new float[] { //Put position, color, and texture coordinates in buffer
        vert.x,
        vert.y,
        vert.z,
        vert.r,
        vert.g,
        vert.b,
        vert.a,
        vert.u,
        vert.v
    });
}
dataBuffer.flip();
GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
indices.clear();
indices.put(indArray.getIndices());
indices.flip();
GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

但屏幕上没有任何内容。如果我使用glGetBufferSubData从vbo中检索数据,我会得到一个填充零的缓冲区。但是,如果我改变

GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);

GL15.glBufferData(GL15.GL_ARRAY_BUFFER, dataBuffer, GL15.GL_DYNAMIC_DRAW);

我改变了

GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);

GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);

屏幕上会出现所有内容,glGetBufferSubData将返回我最初放入的内容。我不想使用glBufferData,因为我每帧都这样做,我不想每帧重新分配内存。我在做什么导致glBufferSubData不起作用?

1 个答案:

答案 0 :(得分:1)

GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);

首先,不要将缓冲区对象作为第一个参数传递;你传递绑定缓冲区对象的目标。你把它绑定到GL15.GL_ARRAY_BUFFER,所以你传递了它。

其次,如果此时dataBuffer为空,则此glBufferData实际上大小为0. glBufferSubData无法重新分配缓冲区的大小。我建议使用正确的glBufferData来分配特定大小的缓冲存储空间,而不是传递dataBuffer

并确保您之后的glBufferSubData来电不会尝试在该存储空间之外设置内存。所以分配一堆内存。

最后,如果您对此有所了解,请调查一些buffer object streaming techniques