JOGL. OpenGL. Как обновить VBO? - PullRequest
1 голос
/ 24 марта 2019

Идея - нарисовать какую-нибудь линию по коду:

gl.glBindBuffer(GL_ARRAY_BUFFER, line.getVertexOpenGLArray());

gl.glVertexAttribPointer(VERTEX_INDEX, 3, GL_FLOAT, false, 0, 0);

gl.glEnableVertexAttribArray(VERTEX_INDEX);

gl.glEnable(GL_DEPTH_TEST);
gl.glDepthFunc(GL_LEQUAL);
gl.glFrontFace(GL_CCW);

gl.glDrawArrays(GL_LINES, 0, line.getVertices().length);

Когда line.getVertexOpenGLArray() возвращает индекс объекта VBO, который был сгенерирован:

        FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
        gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);

pvalues ​​это float[6] {x1,y1,z1,x2,y2,z2} содержит координаты двух вершин этой линии.

Затем я пытаюсь изменить вторую вершину в VBO:

        FloatBuffer line_buf = Buffers.newDirectFloatBuffer(new_vertexes); 

        gl.glBufferSubData(GL_ARRAY_BUFFER, 0, line_buf.limit() * 4, line_buf);
        Buffer f = Buffers.newDirectFloatBuffer(line_vertexes);

        gl.glGetBufferSubData(GL_ARRAY_BUFFER, 0, line_buf.limit() * 4, f);

        System.out.println("Vertexes: " +
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get());

И он сообщает, что значения были успешно изменены. Но когда я отрисовываю следующий кадр, я вижу эту линию, размещенную по координатам старых вершин.

Я пытался использовать gl.glInvalidateBufferData (vbo [VERTEX_INDEX]); но тот же результат.

Есть какой-то кеш или что-то?

1 Ответ

2 голосов
/ 24 марта 2019

Когда line.getVertexOpenGLArray() возвращает индекс объекта VBO, который был сгенерирован:

FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);

Этот код не генерирует "индекс объекта VBO". glGenBuffers резервирует имена для использования в качестве объекта буфера.
glBufferData создает и инициализирует хранилище данных буферного объекта.

Поэтому, когда вызывается gl.glBufferData(...), данные буфера уничтожаются, воссоздаются и инициализируются. Это приводит к потере изменения данных буфера.
Это должно быть сделано только один раз, при инициализации буфера, а не в каждом кадре.

...