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() метод.

Другие вопросы по тегам