更改GlSurfaceView渲染(Change GlSurfaceView renderer)

2019-10-20 17:57发布

我找遍了整个网络,以找出是否可能改变对飞行GLSurfaceView的渲染器。 原因是,我想改变OpenGl的程序,并启动所有属性,并从其顶点和片段着色器统一PARAMS,我不希望任何改变都需要创建一个全新的渲染一个全新的GLSurfaceView。

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

Answer 1:

注:我还没有实现以下。

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


文章来源: Change GlSurfaceView renderer