OpenGL «Недопустимая ошибка операции» После функции glDrawElements на телефоне Android

Я не могу запустить свое приложение на своем телефоне, и я обнаружил ошибку, но мне не хватает знаний в области программирования и английского языка, чтобы исправить ее. . Приложение отлично работает на эмуляторе, без ошибок ни в коде, ни в opengl. Тем не менее, на телефоне все работает без ошибок, но не показывает элементы opengl, которые я хочу нарисовать. Я добавил glGetErrorпочти везде в своем коде и обнаружил ошибку 1282, сгенерированную после glDrawElements, которая является GL_INVALID_OPERATION.

GL_INVALID_OPERATIONгенерируется, если ненулевое имя буферного объекта привязано к включенный массив или массив элементов и хранилище данных буферного объекта в настоящее время сопоставлены.

GL_INVALID_OPERATIONгенерируется, если glDrawElements выполняется между выполнение glBegin и соответствующий glEnd.

В моем коде нет ни glBegin, ни glEnd, так что я предполагаю, что проблема в моем индексном буфере. Ниже я представляю вам все, что у меня есть с индексным буфером.

private ShortBuffer _indexBuffer;

    public void onDrawFrame(GL10 gl) {
    FramesPerSecond.StartCounter();
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    for (int i = 1; i <= 10; i++) {
        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, -1f, -1.0f + -1.5f * i);

        gl.glRotatef(-_xAngle, 1f, 0f, 0f);
        gl.glRotatef(-_yAngle, 0f, 1f, 0f);
        gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);            
        Log.e("Warning", " error code " +gl.glGetError());
    }

Код буфера в моей функции инициализации объекта:

    short[] indeksai = new short[] {
            0, 1, 3, 
            0, 2, 1, 
            0, 3, 2, 
            1, 2, 3, 
    };

    ByteBuffer ibb = ByteBuffer.allocateDirect(indeksai.length * 2);
    ibb.order(ByteOrder.nativeOrder());
    _indexBuffer = ibb.asShortBuffer();
    _indexBuffer.put(indeksai);

И это в основном все, что я сделал с этим буфером.

On SurfaceCreated function >>

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    Log.i(LOG_TAG, "onSurfaceCreated()");
    gl.glMatrixMode(GL10.GL_PROJECTION);
    float ratio = _width / _height;
    gl.glOrthof(-1, 1, -1 / ratio, 1 / ratio, 0.01f, 100.0f);
    gl.glViewport(0, 0, (int) _width, (int) _height);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glClearColor(0f, 0f, 0f, 1.0f);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
initTriangle(gl, context);
try {
loadGLTexture(gl);
    } catch (IOException e) {
   Log.w(LOG_TAG, "Texture fail");
    }
   gl.glEnable(GL10.GL_TEXTURE_2D);            
   gl.glShadeModel(GL10.GL_SMOOTH);            
   gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    
   gl.glClearDepthf(1.0f);                     
   gl.glEnable(GL10.GL_DEPTH_TEST);            
   gl.glDepthFunc(GL10.GL_LEQUAL);             
  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);


}
6
задан Datenshi 20 June 2013 в 06:01
поделиться