#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(...) для его инициализации.
Комментариев нет:
Отправить комментарий