2016-07-04 35 views
0

Ich habe Probleme, meine gerenderten Mesh in meiner GLSurfaceView, und genauer gesagt im Renderer, zu ändern, ich denke, es gibt etwas, was ich nicht im Workflow der Renderer-Klasse.Wie ändere ich die gerenderten Objekte in einem GLSurfaceView.Renderer

Also, lassen Sie uns überlegen, wir haben dies:

public class MyRenderer extends GLSurfaceView.Renderer{ 
    private Mesh aMesh; 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config){ 
     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     aMesh = new Mesh("TestMesh1"); 
    } 
    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     ...Creating viewport... 
    } 
    @Override 
    public void onDrawFrame(GL10 gl) { 
     GLES20.glClear(gl.GL_COLOR_BUFFER_BIT); 
     ...all Maths to create mvpMatrix... 
     aMesh.draw(mvpMatrix); 
    } 
} 

Also das perfekt funktioniert, aMesh ist die Anzeige auf dem Bildschirm mit allen guten Einstellungen. Nun, ich mag diese Masche ändern, wenn der Benutzer eine Taste drückt, und meine Renderer zu aktualisieren ich eine bestimmte Methode in dem Renderer erstellt, wie folgt:

public class MyRenderer extends GLSurfaceView.Renderer{ 
    private Mesh aMesh; 

    public void changeMesh(String newMeshName){ 
     GLES20.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); 
     .... 
     aMesh=new Mesh(newMeshName); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config){ 
     .... 
    } 
    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     ... 
    } 
    @Override 
    public void onDrawFrame(GL10 gl) { 
     aMesh.draw(mvpMatrix); 
    } 
} 

Also in meinem Kopf, rief changeMesh würde onDrawFrame machen Methode, aMesh mit dem neuen Modell neu zu zeichnen, oder? Mein Problem ist, dass das Ergebnis ein leerer Renderer ist. Es stürzt nicht einmal oder so. Wenn ich changeMesh() aufrufen, verschwindet das vorher gut angezeigte Mesh (wie erwartet), aber das neue wird nicht gezeichnet.

Also frage ich mich, ist es erforderlich, einen neuen Renderer zu erstellen (der ein bisschen schwer scheint)? Gibt es eine Möglichkeit, einen Pass in OnSurfaceCreated manuell zu stellen? Ich bin etwas verloren bei diesem Fehler, weil es irgendwie unerwartet ist.

+0

Ihr Code wie beschrieben sollte funktionieren. Ich würde den Draw-Aufruf im Debugger durchlaufen, nachdem Sie Ihr Mesh geändert und überprüft haben, was gezeichnet wird. –

Antwort

1

Teil des Problems war der Aufruf an neue, konnte ich nicht genau erklären, die Gründe, aber es scheint, es ist irgendwie brechen Verknüpfungen zwischen OpenGL-Objekte und meine Puffer. Ich löste das Problem mit einer Art "Setzer", die alle Daten in einer Instanz von Mesh so änderte, dass sie zu den Daten eines anderen Netzes passten, so dass ich die Speicheradresse der ersten Instanz speichern konnte.

Es ist ein bisschen seltsam, aber gut das hat mein Problem gelöst, vielleicht kann es jemand anderem helfen.