我查看了整个网络,以了解是否可以在飞行中更改 GLSurfaceView 的渲染器。原因是我想更改 OpenGl 程序,并从其顶点和 fragment 着色器启动所有属性和统一参数,我不希望任何更改都需要创建一个带有全新渲染器的全新 GLSurfaceView。
看来合理的操作应该是可行的。
最佳答案
注意:我还没有实现以下内容。
GLSurfaceView.Renderer
是一个接口(interface)。实现三遍。两次用于不同的 OpenGL 渲染器,一次附加到 GLSurfaceView
.后者只分派(dispatch)给前者之一,并允许更改它分派(dispatch)到的渲染器。代码必须持有对该渲染器的引用,并且最终必须与绘制调用同步(虽然我不知道)。
请注意,您无法轻松切换 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);
}
}
关于android - 更改 GlSurfaceView 渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25369099/