2012-12-29 220 views
2

我正在制作一个使用lwjgl动态呈现文本的系统。我有一个系统设置为自动生成一个纹理用于​​渲染,并且图像确实有效。问题在哪里。
我有这个代码来初始化2个VBO和一个VAO,两者都被设置为能够处理1024个文本字符值的数据。glBufferSubData导致缓冲区填充零

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

我尝试使用此代码

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

更新VBO的数据,但它没有出现在屏幕上。如果我使用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
GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW); 

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

其次,如果dataBuffer此时为空,则glBufferData的实际大小将为0. glBufferSubData不能重新分配缓冲区的大小。我会建议使用适当的glBufferData来分配特定大小的缓冲区存储,而不是通过dataBuffer

并确保您以后的glBufferSubData调用不会尝试在该存储之外设置内存。因此分配一堆内存。

最后,如果您认真对待此问题,请调查一下buffer object streaming techniques

+0

谢谢,确保我正确初始化缓冲区后,一切似乎都正常。在您链接的页面上,缓冲区重新指定技术是否会实际提高性能,例如从纹理渲染文本,其中所有内容大都是2d? – Unknownloner