#java #android #opengles
Всем привет, у меня возникла ошибка вот в этом куске кода : GLES30.glGenVertexArrays(1, vao, 0); GLES30.glBindVertexArray(vao[0]); int[] vbo = new int[1]; int[] vbo_indices = new int[1]; GLES20.glGenBuffers(1, vbo, 0); GLES20.glGenBuffers(1, vbo_indices, 0); FloatBuffer posBuffer = BufferUtils.createFloatBuffer(positions.length); posBuffer.put(positions); posBuffer.position(0); GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0]); GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, positions.length * 4, posBuffer, GLES30.GL_STATIC_DRAW); GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, 0); GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); IntBuffer indicesBuf = BufferUtils.createIntBuffer(indices.length); indicesBuf.put(indices); indicesBuf.position(0); GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, vbo_indices[0]); GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * 4, indicesBuf, GLES30.GL_STATIC_DRAW); GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0); zGLES30.glBindVertexArray(0); Если точнее, то в : GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * 4, indicesBuf, GLES30.GL_STATIC_DRAW);GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * 4, indicesBuf, GLES30.GL_STATIC_DRAW); Вот сама ошибка : JNI DETECTED ERROR IN APPLICATION: jarray was NULL in call to GetPrimitiveArrayCritical from void android.opengl.GLES20.glBufferData(int, int, java.nio.Buffer, int) Вот еще функция crateIntBuffer: public static IntBuffer createIntBuffer(int numInts) { ByteBuffer buffer = ByteBuffer.allocate(numInts * 4); buffer.order(ByteOrder.nativeOrder()); return buffer.asIntBuffer(); } Прошу тех кто знает в чем проблема помочь, заранее спасибою.
Ответы
Ответ 1
Используйте ByteBuffer.allocateDirect(...) в BufferUtils.createFloatBuffer(positions.length); Проблема в том, что glBufferData требует direct-буфер, который можно эффективно использовать совместно с нативным кодом. Если же используется ByteBuffer.allocate(...) или что-то вроде FloatBuffer.wrap(...), то это не будет direct-буфером. Поэтому надо использовать ByteBuffer.allocateDirect(...) для выделения буфера и ByteBuffer.put(...) для его инициализации.
Комментариев нет:
Отправить комментарий