Подтвердить что ты не робот

OpenGL - связанный массив текстур с массивом указателей, а не вершинным массивом?

Всякий раз, когда мы используем индексный массив для рендеринга текстурированных полигонов с помощью glDraw * Elements *, мы можем предоставить массив вершин и массив координат текстуры. Затем каждый индекс в массиве индексов относится к вершине в некоторой позиции в массиве вершин и соответствующей координате текстуры в той же позиции в массиве текстур. Теперь, если, например, несколько отдельных примитивов (например, QUADS) разделяют одну вершину, но для этой вершины требуются разные координаты текстуры, мы должны дублировать эту вершину в нашем массиве столько раз, сколько у нас есть разные координаты текстуры. Поэтому было бы гораздо удобнее, если бы массив текстурных координат мог быть связан с позициями в массиве индексов. Таким образом, для связывания одной определенной вершины с разными координатами текстуры не требуется дублирование вершин.

Возможно ли это? Если да, то какой синтаксис использовать?

4b9b3361

Ответ 1

Нет. Не так просто.

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

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

Вы должны делать это только в том случае, если память имеет предел.

Ответ 2

Теперь, если, например, несколько отдельных примитивов (например, QUADS) используют одну вершину, но для этой вершины требуются разные координаты текстуры, мы должны дублировать эту вершину в нашем массиве столько раз, сколько у нас есть разные координаты текстуры.

Если координаты текстуры отличаются от примитивов, разделяющих положение вершин, то вершины в целом не разделяются! Вершина - это один вектор, состоящий из

  • Позиция
  • нормально
  • координаты текстуры
  • другие атрибуты

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

Ответ 3

Вы можете дублировать вершины так, чтобы 1 имела 1 текстуру, а другая - другую. Единственное падение этого - если вам нужно морфировать поверхность - вы можете перемещать 1 вершину, но не обе. Конечно, это возможно сделать "императивно", т.е. Когда вы просто запускаете цикл и используете разные координаты текстуры, как вы идете, но это не будет VBO и намного медленнее