2012-12-29 158 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