我在GLSurfaceView中更改渲染网格时遇到了麻烦,更确切地说是在渲染器中,我想在Renderer类的工作流程中有一些我没有理解的东西。
所以,让我们考虑一下:
public class MyRenderer extends GLSurfaceView.Renderer{
private Mesh aMesh;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config){
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
aMesh = new Mesh("TestMesh1");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
...Creating viewport...
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(gl.GL_COLOR_BUFFER_BIT);
...all Maths to create mvpMatrix...
aMesh.draw(mvpMatrix);
}
}
所以这完全有效,aMesh在屏幕上显示所有好的设置。现在,我想在用户按下按钮时更改此网格,并刷新我的渲染器,我在渲染器中创建了一个特定的方法,如下所示:
public class MyRenderer extends GLSurfaceView.Renderer{
private Mesh aMesh;
public void changeMesh(String newMeshName){
GLES20.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT);
....
aMesh=new Mesh(newMeshName);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config){
....
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
...
}
@Override
public void onDrawFrame(GL10 gl) {
aMesh.draw(mvpMatrix);
}
}
所以在我看来,调用changeMesh会使onDrawFrame方法用新模型重绘aMesh,对吧? 我的问题是结果是一个空的渲染器。它甚至没有崩溃。当我调用changeMesh()时,之前显示良好的网格消失(如预期的那样),但新的网格不是绘制的。
所以我想知道,是否需要创建一个新的渲染器(看起来有点沉重)?有没有办法手动询问OnSurfaceCreated的传递?我有点迷失在这个bug上,因为它有点出乎意料。
答案 0 :(得分:1)
问题的一部分是对 new 的调用,我无法解释原因,但似乎它在某种程度上破坏了OpenGL对象和我的缓冲区之间的链接。我用一种“setter”解决了这个问题,它只是改变Mesh实例中的所有数据以适应其他Mesh的数据,这样我就可以保存第一个实例的内存地址。
这有点奇怪,但这解决了我的问题,也许它可以帮助别人。