Несколько отдельных объектов буфера вершин - PullRequest
0 голосов
/ 04 марта 2020

Для рендеринга 3D-объекта создаются четыре отдельных буфера вершин: для вершин, индексов, координат текстуры и нормалей:

private final int[] VBO = new int[4]; // array for vertex buffer objects

private void createVertexBuffers() {
  VBO[0] = 0; VBO[1] = 0; VBO[2] = 0; VBO[3] = 0;

  GLES20.glGenBuffers(4, VBO, 0);
  bufferVertices.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[0]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, VERTEX_STRIDE * NUMBER_VERTICES,
        bufferVertices, GLES20.GL_STATIC_DRAW); // VBO for vertex

  bufferTextureCoordinates.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[1]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, TEXTURE_STRIDE * NUMBERS_TEXTURES,
        bufferTextureCoordinates, GLES20.GL_STATIC_DRAW); // VBO for texture coordinates

  bufferNormals.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[2]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, VERTEX_STRIDE * NUMBER_NORMALS,
        bufferNormals, GLES20.GL_STATIC_DRAW); // VBO for normals

  bufferIndices.position(0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, VBO[3]);
  GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, INT_SIZE * NUMBER_INDICES,
        bufferIndices, GLES20.GL_STATIC_DRAW); // VBO for indices
}

Сами 3D-объекты тоже много, соответственно, количество буферов дополнительно увеличивается. Вопрос: это нормальный подход к использованию множества отдельных буферов? В мобильных приложениях? Буду благодарен за ответы.

Примечание: посмотрел на похожие вопросы, но у меня все еще есть неопределенность.

1 Ответ

1 голос
/ 05 марта 2020

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

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

Как всегда, это происходит с предостережениями. Если упаковка в виде массива структур вынуждает множество выравнивающих элементов корректировать выравнивание, это быстро сказывается на преимуществах.

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