OpenGL - связать массив текстурных координат с индексным массивом, а не с массивом вершин? - PullRequest
18 голосов
/ 17 октября 2011

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

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

Ответы [ 3 ]

11 голосов
/ 17 октября 2011

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

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

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

Вы должны только делать это, если объем памяти выше.

6 голосов
/ 17 октября 2011

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

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

  • положение
  • нормальный
  • координаты текстуры
  • другие атрибуты

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

0 голосов
/ 15 января 2016

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

...