如何使用 GLES20 添加要在运行时绘制的对象?
How to add objects to draw in runtime using GLES20?
在我简单的 GLES20 应用程序中,我试图在运行时添加一些对象来绘制。
在我的渲染器 class 中,我有 ArrayList of Squares:
private ArrayList<Square> mSquares = new ArrayList<Square>();
这是我的 Square class.
Square
如果在onSurfaceCreated
.
中创建它就画得很好
但我真正想做的。我需要在运行时通过单击按钮将新的 Square
添加到 mSquares
并在 onDrawFrame
中绘制正方形。
在我的渲染器中 class 我创建了 AddFigure()
方法:
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));
}
我通过单击 Activity:
中的按钮来调用此方法
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
以某种方式修复它,但没有成功。
也许有一个例子或 wiki 如何正确地做?
这是 ConcurrentModification 错误,这意味着您正试图从与渲染 OpenGL 不同的线程访问渲染管道。
这应该是这样做的方法:
glSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});
在我简单的 GLES20 应用程序中,我试图在运行时添加一些对象来绘制。 在我的渲染器 class 中,我有 ArrayList of Squares:
private ArrayList<Square> mSquares = new ArrayList<Square>();
这是我的 Square class.
Square
如果在onSurfaceCreated
.
但我真正想做的。我需要在运行时通过单击按钮将新的 Square
添加到 mSquares
并在 onDrawFrame
中绘制正方形。
在我的渲染器中 class 我创建了 AddFigure()
方法:
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));
}
我通过单击 Activity:
中的按钮来调用此方法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
以某种方式修复它,但没有成功。
也许有一个例子或 wiki 如何正确地做?
这是 ConcurrentModification 错误,这意味着您正试图从与渲染 OpenGL 不同的线程访问渲染管道。
这应该是这样做的方法:
glSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});