我查看了网络,以了解是否可以在航班上更改GLSurfaceView的渲染器。原因是我想要更改OpenGl程序,并从其顶点和片段着色器启动所有属性和统一参数,我不希望任何更改都需要使用全新的渲染器创建全新的GLSurfaceView。
似乎合理的操作应该是可行的。
答案 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);
}
}