OpenGLES JAVA NIO буферы
В моей игре два экрана. Каждый экран отображается с помощью класса SpriteBatcher. Первый экран отображается нормально. Второй сбой и выдает мне вышеуказанную ошибку.
11-30 13:10:46.530: E/AndroidRuntime(1621): java.lang.IllegalArgumentException: Bad position (limit 0): 2
11-30 13:10:46.530: E/AndroidRuntime(1621): at java.nio.Buffer.positionImpl(Buffer.java:357)
11-30 13:10:46.530: E/AndroidRuntime(1621): at java.nio.Buffer.position(Buffer.java:351)
11-30 13:10:46.530: E/AndroidRuntime(1621):
atcom.rim.framework.gl.Vertices.bind(Vertices.java:66)
Поэтому я пытаюсь получить доступ к позиции буфера 2, пока размер буфера равен 0. В моем коде, хотя я не вижу ошибок.
this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;
ByteBuffer buffer = ByteBuffer.allocateDirect(maxVertices * vertexSize); ///8 bit = 1 byte, 4 byte = 32bit float
buffer.order(ByteOrder.nativeOrder());
vertices = buffer.asFloatBuffer();
Проблема как состояния ошибки находится в моем методе bind():
public void bind() {
GL10 gl = glGraphics.getGL();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, vertexSize, vertices);
if(hasColor) {
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, vertexSize, vertices);
}
if(hasTexCoords) {
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
vertices.position(hasColor?6:2);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, vertexSize, vertices);
}
}
Ошибка была вызвана методом spritebatcher.bind. Я передавал ноль спрайтов, так что я закончил рендеринг нулей...
1 ответ
NIO ByteBuffers имеют ограничение и емкость. Предел является "мягким" пределом; емкость определяет, сколько буфер может фактически содержать. Вы пытаетесь расположиться за мягким пределом.
На вновь созданном буфере ограничение будет равно емкости. Похоже, что-то изменило предел на ноль. Вы можете сбросить предел (и отметку, и положение) с помощью clear()
метод.