2016-08-15 2 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 네트워크 메시지에서 정점 데이터를받을 수 있습니다. 정점 수는 3보다 큽니다. 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를 업데이트하고 그리기 기능에서 VBO 캐시를 업데이트하십시오. 이 문제는 해결 될 것입니다.

+0

이 버퍼 캐시는 주 스레드에 있어야합니다. –

관련 문제