Как получить вершины меша, нарисованного в OpenGL ES? - PullRequest
0 голосов
/ 14 февраля 2011

Предположим, я рисую куб следующим образом:

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer);

        gl.glTranslatef(x, y, z);
        gl.glRotatef(rz, 0, 0, 1);
        gl.glRotatef(rx, 1, 0, 0);
        gl.glRotatef(ry, 0, 1, 0);

        gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
           float[] result = getVertices(mVerticesBuffer);

Где mVerticesBuffer - это FloatBuffer с вершинами куба.После перемещения вращающегося куба я ожидаю, что значение valus в mVerticesBuffer изменилось, и я смогу вернуть эти значения в виде простого плавающего массива.Когда я пытаюсь получить эти значения из mVerticesBuffer, я всегда получаю значения, которые соответствуют местоположению куба перед любыми переводами / вращениями.Есть ли API OpenGL для получения правильных значений или я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Вам нужен точный случай обратной связи преобразования (TF): вы хотите вернуть преобразованные вершины. Это прекрасно для современного OpenGL. Вот инструкции по его использованию:

  1. Создайте шейдер (только с компонентами вершины), который выполняет необходимое преобразование вершины.Вызовите glTransformFeedbackVaryings перед связыванием и сообщите GL о ваших различных выходных данных в шейдере, который вы хотите записать.
  2. Подготовьте VBO для сохранения результата.Перед выполнением TF вызовите glBindBufferBase, чтобы сообщить GL о хранилище для результирующих значений.
  3. При выполнении TF вызовите glBeginTransformFeedback () и запишите запрос типа GL_PRIMITIVES_WRITTEN.
2 голосов
/ 14 февраля 2011

OpenGL не математическая библиотека.Он не будет вносить никаких изменений в данные, которые вы передаете ему.Вы можете запрашивать содержимое буферов и тому подобного, но только по явному запросу, а не так, как вы ошибочно ожидаете.

Преобразование, определенное представлением модели и матрицей проекции, которые управляются с помощью glLoadMatrix, glMultMatrixglTranslate, glRotate, glScale, эти преобразования применяются in-situ к позициям вершин только для обработки каждой вершины и не сохраняются постоянно.Существует обратная связь с преобразованием для извлечения преобразованных данных вершины, но она проходит через другой объект OpenGL и буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...