代码之家  ›  专栏  ›  技术社区  ›  ashchuk

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

  •  1
  • ashchuk  · 技术社区  · 9 年前

    在我简单的GLES20应用程序中,我试图在运行时添加一些对象来绘制。 在我的渲染器类中,我有正方形的ArrayList:

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

    这是我的 Square

    Square 如果在中创建,绘图是否良好 onSurfaceCreated .

    广场 进入 mSquares onDrawFrame .

    在我的渲染器类中,我创建了 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));
    }
    

    我通过单击活动中的按钮来调用此方法:

    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 ,但没有成功。 也许有一个例子或维基如何做它的权利?

    1 回复  |  直到 9 年前
        1
  •  0
  •   andras    9 年前

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

    这应该是做到这一点的方法:

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