2012-05-22 27 views
6

No puedo ejecutar mi aplicación en mi teléfono, y encontré el error, pero carezco de los conocimientos en programación y en inglés para repararlo. La aplicación se ejecuta en el emulador perfectamente, sin ningún error en el código ni en OpenGL. Sin embargo, en el teléfono todo funciona bien sin ningún error, pero no muestra ningún elemento abierto que quiera dibujar. He agregado glGetError casi todo en mi código, y encontré el error 1282 generado después de glDrawElements que es GL_INVALID_OPERATION.OpenGL "Error de operación no válido" Después de que la función GlDrawElements en el teléfono Android

GL_INVALID_OPERATION se genera si un nombre de objeto de búfer distinto de cero está vinculado a una matriz habilitada o la matriz de elementos y el almacén de datos del objeto de búfer están mapeados actualmente.

GL_INVALID_OPERATION se genera si glDrawElements se ejecuta entre la ejecución de glBegin y el glEnd correspondiente.

No tengo glBegin o glEND en mi código, así que supongo que el problema está en mi buffer de index. A continuación te presento todo lo que tengo con el buffer de indexación.

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()); 
    } 

Código de tampón en mi función de inicialización de objetos:

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); 

Y eso es, básicamente, todo lo que he hecho con este tampón.

En función surfaceCreated >>

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); 


} 
+0

¿Puedes publicar el código donde inicializas OpenGL? – CaseyB

+0

Agregué la función SurfaceSurface, supongo que esto es lo que has preguntado :) – Datenshi

+0

¿Y quién invoca 'onDrawFrame()'? –

Respuesta

6

Es más probable porque estás permitiendo GL_COLOR_ARRAY pero en realidad nunca establecer el glColorPointer. Intente comentar la línea gl.glEnableClientState(GL10.GL_COLOR_ARRAY);.

+0

Sí. Esto solucionó todo, eso fue un remanente de mis pruebas con colorear el objeto, en lugar de ponerle una textura ... ¡Muchas gracias! – Datenshi

+0

¡Me alegro de ayudar! – CaseyB

Cuestiones relacionadas