我找遍了整个网络,以找出是否可能改变对飞行GLSurfaceView的渲染器。 原因是,我想改变OpenGl的程序,并启动所有属性,并从其顶点和片段着色器统一PARAMS,我不希望任何改变都需要创建一个全新的渲染一个全新的GLSurfaceView。
这似乎是合理的操作,应该是可行的。
我找遍了整个网络,以找出是否可能改变对飞行GLSurfaceView的渲染器。 原因是,我想改变OpenGl的程序,并启动所有属性,并从其顶点和片段着色器统一PARAMS,我不希望任何改变都需要创建一个全新的渲染一个全新的GLSurfaceView。
这似乎是合理的操作,应该是可行的。
注:我还没有实现以下。
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);
}
}