如何使用 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

我尝试使用 glBufferDataglBufferSubData 以某种方式修复它,但没有成功。 也许有一个例子或 wiki 如何正确地做?

这是 ConcurrentModification 错误,这意味着您正试图从与渲染 OpenGL 不同的线程访问渲染管道。

这应该是这样做的方法:

glSurfaceView.queueEvent(new Runnable() {
                    @Override
                    public void run() {
                        mGLRenderer.AddFigure(1f, 1f, 1f);
                    }
                });