Как добавить объекты для рисования во время выполнения с помощью GLES20?
В моем простом приложении GLES20 я пытаюсь добавить некоторые объекты во время выполнения для рисования. В моем классе Renderer у меня есть ArrayList of Squares:
private ArrayList<Square> mSquares = new ArrayList<Square>();
Вот мой квадратный класс.
Square
хорошо рисует, если создать его в onSurfaceCreated
,
Но то, что я на самом деле хочу сделать. Мне нужно добавить новый 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));
}
Я вызываю этот метод, нажав на кнопку в моей активности:
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 ответ
Это ошибка ConcurrentModification, которая означает, что вы пытаетесь получить доступ к конвейеру рендеринга из потока, отличного от рендеринга OpenGL.
Это должен быть способ сделать это:
glSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});