2012-05-22 12 views
6

Non riesco a eseguire l'app sul mio telefono e ho individuato l'errore, ma non ho le conoscenze in programmazione e in inglese per ripararlo. L'app viene eseguita su emulatore perfettamente, senza errori nel codice né in opengl. Eppure al telefono tutto funziona bene senza errori, ma non mostra elementi opengl che voglio disegnare. Ho aggiunto glGetError quasi tutto nel mio codice e ho trovato l'errore 1282 generato dopo glDrawElements che è GL_INVALID_OPERATION.OpenGL "Errore operazione non valido" Dopo la funzione glDrawElements su telefono Android

GL_INVALID_OPERATION viene generato se un nome di oggetto buffer diverso da zero è associato a un array abilitato o all'array di elementi e l'archivio dati dell'oggetto buffer è attualmente mappato.

GL_INVALID_OPERATION viene generato se glDrawElements viene eseguito tra l'esecuzione di glBegin e la glEnd corrispondente.

Non ho glBegin o glEnd nel mio codice, quindi credo che il problema sia nel mio indexbuffer. Di seguito vi presento tutto quello che ho con l'indexbuffer.

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

Codice di tampone nella mia funzione di inizializzazione oggetto:

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

E questo è tutto quello basicaly ho fatto con questo buffer.

Sulla funzione 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

Puoi pubblicare il codice dove inizializzi OpenGL? – CaseyB

+0

Ho aggiunto la funzione SurfaceCreated, immagino che questo sia quello che hai chiesto :)? – Datenshi

+0

E chi invoca 'onDrawFrame()'? –

risposta

6

E 'molto probabilmente perché si sta abilitando GL_COLOR_ARRAY ma mai effettivamente l'impostazione del glColorPointer. Prova a commentare la linea gl.glEnableClientState(GL10.GL_COLOR_ARRAY);.

+0

Sì. Questo ha risolto tutto, quello era un avanzo dai miei provini con la colorazione dell'oggetto, invece di mettere una texture su di esso ... Grazie mille! – Datenshi

+0

Felice di aiutare !!! – CaseyB

Problemi correlati