2012-12-29 2 views
2

저는 lwjgl을 사용하여 텍스트를 동적으로 렌더링하는 시스템을 만들고 있습니다. 렌더링에 사용할 텍스처를 자동으로 생성하도록 시스템을 설정 했으므로 이미지가 제대로 작동합니다. 여기에 문제가 있습니다.
2 개의 VBO 및 VAO를 초기화하는이 코드가 있는데, 둘 다 1024 개의 텍스트 문자 데이터를 처리 할 수 ​​있도록 설정되어 있습니다.glBufferSubData가 0으로 채우기 버퍼를 만듭니다.

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의 데이터를 업데이트하려고하지만 아무것도 화면에 나타납니다. vbo에서 데이터를 검색하기 위해 glGetBufferSubData를 사용하면 0으로 채워지는 버퍼를 얻게됩니다. 그러나, 나는이 변경되면

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

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

수하고 나는

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

모든 화면에 표시 할 예정입니다

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

을 변경하고 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

감사합니다. 버퍼가 제대로 초기화되었는지 확인한 후에 모든 것이 제대로 작동하는 것 같습니다. 링크 된 페이지의 버퍼 재 지정 기술이 텍스처에서 텍스트를 렌더링하는 것과 같이 거의 모든 부분이 2 차원 인 경우에 눈에 띄는 성능 향상을 가져다 줄까요? – Unknownloner

관련 문제