1
在渲染器初始化過程中,創建了VBO並綁定到GL_ARRAY_BUFFER或GL_ELEMENTS_ARRAY_BUFFER,並且第一個頂點有三個頂點。調用glBufferData將這三個頂點的屬性緩存到GPU。 如:重複調用glBufferData未能爲新緩衝區分配內存
InitVBO() {
vboArray = new int[4];
GLES20.glGenBuffers(4, vboArray, 0);
poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdatePose(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE/Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW); // poseBuf initialized capacity is 9 * 4
GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, params, 0); // Get params[0] is 36
colorBuf = ByteBuffer.allocateDirect(colorLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdateColor(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_GRID_COLOR]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, colorLength * Float.SIZE/Byte.SIZE, gridColorBuf, GLES20.GL_DYNAMIC_DRAW);
...
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}
之後,從TCP網絡消息接收子線程的頂點數據。頂點的數量超過三個。我回顧了glBufferData:
UpdateVBO(){
poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdatePose(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE/Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW); // poseBuf has been updated with capacity 12 * 4
GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, pnew, 0); // get pnew[0] is 0
...
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}
爲什麼OpenGL ES Server不爲新緩衝區分配內存?
這是否意味着創建緩衝區緩存必須在主線程中? –