2016-08-15 74 views
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不爲新緩衝區分配內存?

回答

0

我找到了答案。

我的程序的重大錯誤是我不應該更新程序的子線程中的緩衝區緩存。

如果我創建一個由子線程調用的函數來更新頂點poseBuf,並在draw函數中更新VBO緩存。這個問題將被解決。

+0

這是否意味着創建緩衝區緩存必須在主線程中? –