2016-07-04 5 views
0

У меня возникли проблемы с изменением рендеринговой сетки в моем GLSurfaceView, а точнее в Renderer, я предполагаю, что в рабочем процессе Класс рендерера.Как изменить рендер объектов в GLSurfaceView.Renderer

Итак, давайте рассмотрим, мы имеем следующее:

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

Так что это прекрасно работает, AMESH является отображение на экране со всеми хорошими настройками. Теперь я хочу изменить эту сетку, когда пользователь нажимает на кнопку, и обновить свой рендер Я создал специфический метод в визуализаторе, как следует:

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

Так что в моем уме, вызывая changeMesh бы onDrawFrame метод перерисовать aMesh с новой моделью, правильно? Моя проблема заключается в том, что результатом является пустой рендерер. Это даже не крушение или так. Когда я вызываю changeMesh(), ранее хорошо отображаемая сетка исчезает (как и ожидалось), но новая не является ничьей.

Так что мне интересно, для этого требуется создать новый рендерер (который кажется немного тяжелым)? Есть ли способ запросить пропуск в OnSurfaceCreated вручную? Я немного потерял эту ошибку, потому что это неожиданно.

+0

Ваш код, как описано, должен работать. После того, как вы изменили свою сетку и проверили, что происходит, я перейду через вызов рисования в отладчике. –

ответ

1

Отчасти проблема заключалась в вызове новых, я не мог объяснить точно причины, но кажется, что это как-то нарушает связи между объектами OpenGL и моими буферами. Я решил проблему с каким-то «сеттером», который просто меняет все данные в экземпляре Mesh, чтобы соответствовать данным другого Mesh, таким образом я мог сохранить адрес памяти первого экземпляра.

Это немного странно, но хорошо это решило мою проблему, возможно, это может помочь кому-то еще.