如何更改 GLSurfaceView.Renderer 中的渲染对象

How to change the rendered objects in a GLSurfaceView.Renderer

我在更改 GLSurfaceView 中渲染的网格时遇到问题,更准确地说是在渲染器中,我想在渲染器的工作流程中有一些我不理解的地方 class。

所以,让我们考虑一下我们有这个:

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

所以在我看来,调用 changeMes​​h 会使 onDrawFrame 方法使用新模型重绘 aMesh,对吗? 我的问题是结果是一个空的渲染器。它甚至没有崩溃。当我调用 changeMes​​h() 时,之前显示良好的网格消失了(如预期的那样),但新的网格没有绘制。

所以我想知道,是否需要创建一个新的Renderer(看起来有点重)?有没有办法手动询问 OnSurfaceCreated 的通行证?我对这个错误有点迷茫,因为它有点出乎意料。

部分问题是对 new 的调用,我无法准确解释原因,但它似乎以某种方式破坏了 OpenGL 对象和我的缓冲区之间的链接。我用一种 "setter" 解决了这个问题,它只是改变一个 Mesh 实例中的所有数据以适应另一个 Mesh 的数据,这样我就可以保存第一个实例的内存地址。

有点奇怪,但这很好地解决了我的问题,也许它可以帮助其他人。