2014-06-11 3 views
0

J'essaie de créer un cube tridimensionnel avec OpenGL. Le cube dimensionnel est obtenu. Essayer d'ajouter un autre côté du cube. Et là, je vois cette erreur:OpenGL NULL POINTER EXCEPTION

LogCat dites-moi est que

triangle1Buffer = NULL

FATAL EXCEPTION: GLThread 270 
    java.lang.NullPointerException 
      at com.google.android.gles_jni.GLImpl.glVertexPointer(GLImpl.java:1122) 
      at com.podlinov.elseapp.app.Renderer.onDrawFrame(Renderer.java:94) 

code:

public class Renderer implements GLSurfaceView.Renderer { 

    @Override 
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { 

    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 

     gl.glViewport(0, 0, width, height); 
     float ratio = (float) width/height; 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); 
    } 

    float [] triangle = { 
      0, 0, 0, // A 
      1, 0, 0, // B 
      0, 1, 0 , // C 

      1, 0, 0, // B 
      1, 1, 0 , // D 
      0, 1, 0 , // C 
    }; 

    float [] triangle2 = { 
      0, 0, 0, // A 
      1, 0, 0, // B 
      0, 1, 0, // C 
    }; 


    FloatBuffer triangleBuffer; 
    FloatBuffer triangle1Buffer; 

    public Renderer() { 

     ByteBuffer bb = ByteBuffer.allocateDirect(6*3*4); 
     bb.order(ByteOrder.nativeOrder()); 
     triangleBuffer = bb.asFloatBuffer(); 
     triangleBuffer.put(triangle); 
     triangleBuffer.position(0); 

     ByteBuffer bb2 = ByteBuffer.allocateDirect(3*3*4); 
     bb2.order(ByteOrder.nativeOrder()); 
     triangleBuffer = bb2.asFloatBuffer(); 
     triangleBuffer.put(triangle2); 
     triangleBuffer.position(0); 

    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

     gl.glColor4f(1,0,1,1); 
     gl.glTranslatef(-1.5f, 0.5f, -3f); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleBuffer); 
     gl.glDrawArrays(GL10.GL_TRIANGLES, 0,6); 


     gl.glColor4f(0,0,1,1); 
     gl.glTranslatef(1.5f, 0, -3f); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle1Buffer); // NULL POINTER EXCEPTION triangle1Buffer =NULL 
     gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3); 
    } 

} 
+0

Vous remplissez triangleBuffer deux fois dans votre constructeur. Je parie que vous avez voulu remplir à la fois triangleBuffer et triangle1Buffer là. – ThaMe90

+0

@ ThaMe90 votre réponse est correcte aussi. ths! – Garf1eld

Répondre

0

Je pense que votre problème est ici:

ByteBuffer bb2 = ByteBuffer.allocateDirect(3*3*4); 
    bb2.order(ByteOrder.nativeOrder()); 
    triangleBuffer = bb2.asFloatBuffer(); 
    triangleBuffer.put(triangle2); 
    triangleBuffer.position(0); 

Vous devriez l'ai changé en triangle1Buffer Im devinant?

+0

Merci beaucoup !!!!! – Garf1eld

+0

Pas de problème. Vous pourriez réellement utiliser GL_QUADS d'OpenGL au lieu de GL_TRIANGLES pour dessiner un cube, il faudrait moins de faces pour dessiner (puisque un cube a 6 côtés carrés au lieu de 12 triangulaires). Assurez-vous juste d'ajouter des vertices aux matrices flottantes et changez le tampon tailles - qui en passant, 3 * 3 * 4 est 36, mais votre tableau triangle2 n'a que 9 valeurs. Ne doit-il pas être 3 * 3, ou suis-je stupide? – Monkey

+0

La valeur de triangle2 est juste pour exaple. – Garf1eld