Объединение массивов вершин с текстурами в OpenGL - PullRequest
4 голосов
/ 02 сентября 2011

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

glBegin(GL_TRIANGLES) {
  for ( int faceIdx = 0; faceIdx < nFaces; ++faceIdx )
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);      
     glVertex3fv(&vertexArray[vIdx]);
     glTexCoord2fv(&texCoord[vIdx++]);  
  }   
} 
glEnd();

Однако для удобства чтения, скорости и всего остального я хочу использовать массивы вершин (с целью перехода к VBO). Есть ли способ обойти одну вершину в массиве несколько раз?

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

Можно ли использовать массивы вершин, указав координаты текстуры, без использования избыточных (под которыми я подразумеваю повторяющиеся) вершин?

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

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

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

0 голосов
/ 02 сентября 2011

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

...