2016-07-04 4 views
0

J'ai du mal à changer le maillage rendu dans mon GLSurfaceView, et plus précisément dans le Renderer, je suppose qu'il y a quelque chose que je n'ai pas compris dans le workflow du Classe de renduComment changer les objets rendus dans un GLSurfaceView.Renderer

Donc, nous considérons que nous avons ceci:

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

C'est donc parfaitement travail, AMESH est affichage à l'écran avec tous les bons réglages. Maintenant, je veux changer ce maillage lorsque l'utilisateur appuie sur un bouton, et pour me rafraîchir renderer j'ai créé une méthode spécifique dans le moteur de rendu, comme suit:

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

Donc, dans mon esprit, appelant changeMesh ferait onDrawFrame méthode pour redessiner aMesh avec le nouveau modèle, non? Mon problème est que le résultat est un moteur de rendu vide. Il ne s'écrase même pas ou alors. Quand j'appelle changeMesh(), le maillage précédemment bien affiché disparaît (comme prévu), mais le nouveau n'est pas dessiné.

Alors je me demande, est-ce que cela nécessite de créer un nouveau Renderer (qui semble un peu lourd)? Existe-t-il un moyen de demander une passe dans OnSurfaceCreated manuellement? Je suis un peu perdu sur ce bug parce que c'est un peu inattendu.

+0

Votre code tel que décrit devrait fonctionner. Je passerais par l'appel de dessin dans le débogueur après que vous ayez changé votre maillage et vérifié ce qui est dessiné. –

Répondre

1

Une partie du problème était l'appel à nouveau, je ne pouvais pas expliquer exactement les raisons, mais il semble que ce soit en quelque sorte briser les liens entre les objets OpenGL et mes tampons. J'ai résolu le problème avec une sorte de "setter" qui change juste toutes les données dans une instance de Mesh pour s'adapter aux données d'un autre Mesh, de cette façon je pourrais sauvegarder l'adresse mémoire de la première instance.

C'est un peu étrange mais bon cela a résolu mon problème, peut-être que ça peut aider quelqu'un d'autre.