如何使用GLES20添加要在运行时绘制的对象?

时间:2017-07-10 12:08:21

标签: android opengl-es gles20

在我简单的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

我尝试使用glBufferSubDataNumber.isNaN以某种方式修复它,但没有成功。 也许有一个例子或维基怎么做呢?

1 个答案:

答案 0 :(得分:0)

它的ConcurrentModification错误,这意味着您尝试从与呈现OpenGL不同的线程访问渲染管道。

这应该是这样做的方法:

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