在我简单的GLES20应用程序中,我试图在运行时添加一些对象来绘制。 在我的Renderer类中,我有SquareList的SquareList:
private ArrayList<Square> mSquares = new ArrayList<Square>();
这是我的Square课程。
如果在Square
中创建 onSurfaceCreated
,那么
Square
就会很好。
但我真正想做的事情。我需要在运行时通过按钮单击并在mSquares
中绘制方块,将新onDrawFrame
添加到AddFigure()
。
在我的Renderer类中,我创建了public void AddFigure(float x, float y, float z)
{ // color coords angle
mSquares.add(new Square("Red square", new float[] {1, 0, 0, 1}, new float[] {x, y, z}, 100f));
}
方法:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});
我通过点击我的活动中的按钮来调用此方法:
E/AndroidRuntime: FATAL EXCEPTION: GLThread 220
java.util.ConcurrentModificationException
但它总是抛出这些例外:
E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
E/emuglGLESv2_enc: device/generic/goldfish-opengl/system/GLESv2_enc/GL2Encoder.cpp:s_glEnableVertexAttribArray:741 GL error 0x501
Info: Invalid vertex attribute index. Wanted index: 4294967295. Max index: 16
和
glBufferData
我尝试使用glBufferSubData
和Number.isNaN
以某种方式修复它,但没有成功。
也许有一个例子或维基怎么做呢?
答案 0 :(得分:0)
它的ConcurrentModification错误,这意味着您尝试从与呈现OpenGL不同的线程访问渲染管道。
这应该是这样做的方法:
glSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});