2010-10-08 6 views
1

Encore une fois j'essaie d'entrer dans openGL, mais comme d'habitude je m'étouffe en passant des vertices/vertix/quoi que ce soit et chaque petit détail peut conduire à un désastre (mauvais format, initialisation non correctement configuré, où les mémoires sont sauvegardées, etc.).Pourquoi est-ce que mon moteur de rendu android openGL ES crash

Mon objectif principal est d'utiliser OpenGL pour les graphiques 2D afin d'accélérer les performances par rapport au dessin habituel des cpu.

Quoi qu'il en soit, mon openGL Renderer ressemble à ceci:

package com.derp.testopengl; 


import java.nio.Buffer; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.opengl.GLU; 
import android.opengl.GLSurfaceView.Renderer; 

public class OpenGLRenderer implements Renderer { 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     // Set the background color to black (rgba). 
     gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f); // OpenGL docs. 
     // Enable Smooth Shading, default not really needed. 
     gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs. 
     // Depth buffer setup. 
     gl.glClearDepthf(1.0f);// OpenGL docs. 
     // Enables depth testing. 
     gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs. 
     // The type of depth testing to do. 
     gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs. 
     // Really nice perspective calculations. 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs. 
          GL10.GL_NICEST); 
    } 


    public void onDrawFrame(GL10 gl) { 
     // Clears the screen and depth buffer. 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs. 
          GL10.GL_DEPTH_BUFFER_BIT); 

     // Define the points of my triangle 
     float floatbuff[] = { 
       1.0f,0.0f,0.0f, 
       0.0f,1.0f,0.0f, 
       -1.0f,0.0f,0.0f 
       }; 
     // Create memory on the heap 
     ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
     vbb.order(ByteOrder.nativeOrder()); 
     FloatBuffer vertices = vbb.asFloatBuffer(); 

     // Insert points into floatbuffer 
     vertices.put(floatbuff); 
     // Reset position 
     vertices.position(0); 

     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

     // Change color to green 
     gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 

     // Pass vertices to openGL 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices); 

     // Draw 'em 
     gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    } 


    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     // Sets the current view port to the new size. 
     gl.glViewport(0, 0, width, height);// OpenGL docs. 
     // Select the projection matrix 
     gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs. 
     // Reset the projection matrix 
     gl.glLoadIdentity();// OpenGL docs. 

     // Should give a 2D coordinate system that responds to the screen 
     gl.glOrthof(0.0f, width, 0.0f, height, 0, 200.0f); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity();// OpenGL docs. 
    } 
} 

Il plantage actuellement sur la ligne:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

Avec un IndexOutOfBoundsException, mais je suis sûr qu'il ya plus de problèmes avec le code .

Reconnaissant pour toute aide!

Répondre

0

Essayez de changer cette situation

// Create memory on the heap 
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
vbb.order(ByteOrder.nativeOrder()); 
FloatBuffer vertices = vbb.asFloatBuffer(); 

// Insert points into floatbuffer 
vertices.put(floatbuff); 
// Reset position 
vertices.position(0); 

à ceci:

FloatBuffer vertices = FloatBuffer.wrap(floatbuff); 
1

Vous avez sans doute déjà résolu le problème mais je pensais que je l'ai mis dans la réponse pour quelqu'un d'autre. Lorsque vous avez appelé cette ligne:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

Vous dites qu'il y a 3 triangles dans le tampon des sommets. Mais il y a en réalité 1 triangle. Vous devez remplacer 3 avec:

vertices.length/3 

De cette façon, si vous mettez plus de points pour plus de polygones, il va rendre correctement. J'espère que cela t'aides.

-Brian

PS: Je suis en train d'apprendre comment utiliser opengl avec Android. Donc, je découvre tous ces petits problèmes aussi. Bonne chance :)

0

il ne peut pas être répondu mais un conseil ... ne mettez pas ce code ci-dessous dans OnDrawFrame, puisque vos coordonnées triangle ne changent pas ... faire ce genre de choses dans onSurfaceCreated. faire FloatBuffer une variable membre de la classe

// Define the points of my triangle 
    float floatbuff[] = { 
      1.0f,0.0f,0.0f, 
      0.0f,1.0f,0.0f, 
      -1.0f,0.0f,0.0f 
      }; 
    // Create memory on the heap 
    ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
    vbb.order(ByteOrder.nativeOrder()); 
    FloatBuffer vertices = vbb.asFloatBuffer(); 

    // Insert points into floatbuffer 
    vertices.put(floatbuff); 

jeter un oeil à cette classe TriangleRenderer.java il vous donnera base