更改GlSurfaceView渲染器

时间:2014-08-18 17:44:58

标签: android opengl-es opengl-es-2.0 glsurfaceview

我查看了网络,以了解是否可以在航班上更改GLSurfaceView的渲染器。原因是我想要更改OpenGl程序,并从其顶点和片段着色器启动所有属性和统一参数,我不希望任何更改都需要使用全新的渲染器创建全新的GLSurfaceView。

似乎合理的操作应该是可行的。

1 个答案:

答案 0 :(得分:4)

注意:我没有实现以下内容。

GLSurfaceView.Renderer是一个界面。实施三次。您的不同OpenGL渲染器两次,并且一次附加到GLSurfaceView。后者只发送给前者之一,并允许更改它发送的渲染器。代码必须包含对此渲染器的引用,并最终必须与绘制调用同步(尽管我不知道)。

请注意,您无法轻松切换OpenGLES上下文数据。它在所有渲染器实例之间共享。

class DispatchingRenderer implements GLSurfaceView.Renderer {
    private class Renderer1 implements GLSurfaceView.Renderer {
       ...
    }
    private class Renderer2 implements GLSurfaceView.Renderer {
       ...
    }

    public DispatchingRenderer() {
        this.r1 = new Renderer1();
        this.r2 = new Renderer2();

        this.currentRenderer = this.r1;
    }
    public void ToggleRenderer() {
        if(this.currentRenderer == this.r1) {
            this.currentRenderer = this.r2;
        } else if (this.currentRenderer == this.r2) {
            this.currentRenderer = this.r1;
        }
    }
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // do one-time setup
    }
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        this.currentRenderer.onSurfaceChanged(gl, w, h);
    }
    public void onDrawFrame(GL10 gl) {
        this.currentRenderer.onDrawFrame(gl);
    }
}