【问题标题】:How to add objects to draw in runtime using GLES20?如何使用 GLES20 添加对象以在运行时绘制?
【发布时间】:2017-07-10 12:08:20
【问题描述】:

在我的简单 GLES20 应用程序中,我尝试在运行时添加一些对象以进行绘制。 在我的渲染器类中,我有 ArrayList of Squares:

private ArrayList<Square> mSquares = new ArrayList<Square>();

这是我的Square 课程。

如果在onSurfaceCreated 中创建Square,则可以很好地绘制。

但我真正想做的事。我需要在运行时通过单击按钮将新的Square 添加到mSquares 中并在onDrawFrame 中绘制正方形。

在我的 Renderer 类中,我创建了 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如何正确地做到这一点?

【问题讨论】:

  • ArrayList 不是线程安全的,所以你应该让它同步尝试 Collections.synchronizedList()

标签: android opengl-es gles20


【解决方案1】:

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

这应该是这样做的方法:

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

【讨论】:

  • 就是这样!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 2020-08-01
  • 2015-11-03
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多