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);
}
Puoi pubblicare il codice dove inizializzi OpenGL? – CaseyB
Ho aggiunto la funzione SurfaceCreated, immagino che questo sia quello che hai chiesto :)? – Datenshi
E chi invoca 'onDrawFrame()'? –