【发布时间】:2014-08-18 17:44:57
【问题描述】:
我查看了整个网络,以了解是否可以在航班上更改 GLSurfaceView 的渲染器。原因是我想更改 OpenGL 程序,并从其顶点和片段着色器启动所有属性和统一参数,并且我不希望任何更改都需要使用全新的渲染器创建全新的 GLSurfaceView。
这似乎是应该可行的合理操作。
【问题讨论】:
标签: android opengl-es opengl-es-2.0 glsurfaceview
我查看了整个网络,以了解是否可以在航班上更改 GLSurfaceView 的渲染器。原因是我想更改 OpenGL 程序,并从其顶点和片段着色器启动所有属性和统一参数,并且我不希望任何更改都需要使用全新的渲染器创建全新的 GLSurfaceView。
这似乎是应该可行的合理操作。
【问题讨论】:
标签: android opengl-es opengl-es-2.0 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);
}
}
【讨论】: