Какой смысл в индексном буфере для триангулированной сетки
Предположим, у меня есть триангулированная сетка, тогда у меня много повторяющихся позиций между треугольниками, и индексный буфер может стать очень удобным в этом случае.
Но если мне также нужны нормали, то нет усиления, потому что все треугольники имеют разные нормали. Так что кортеж { position, normal } уникален. Если добавить координаты текстуры и другие функции, то я не понимаю, для чего нужен индексный буфер?
1 ответ
Нормалы часто хранятся для каждой вершины, а не для каждой грани (грань является треугольником). Если у вас есть несколько треугольников, разделяющих одну вершину, вы можете усреднить все нормали всех граней, чтобы получить нормаль вершины. Теперь вы просто интерполируете эти нормали при рендеринге и получаете гладкую поверхность. Некоторые типы файлов даже разработаны таким образом, что вы не можете хранить нормаль для каждого треугольника, только нормаль для каждой вершины. Это очень распространенный способ хранения и интерпретации нормалей, особенно в графике в реальном времени.
Координаты текстуры также большую часть времени занимают одну вершину. Если у вас есть гладкая поверхность, вам, скорее всего, не нужно будет внезапно менять текстуру. Чтобы получить видимость на поверхности, вы просто наносите их на текстуру, но сохраняете координаты. Таким образом, вы можете хранить координаты текстуры для каждой вершины совершенно нормально.
Мораль этой истории состоит в том, что есть очень очень мало вещей, которые на самом деле нужно хранить для каждого лица. Большая часть нужных вам данных может быть преобразована в представление для каждой вершины. В частности, нормали и текстурные координаты часто нужны для каждой вершины, а не для грани.
Также отметим, что если вам не нужны гладкие поверхности, а плоские поверхности (чтобы вы могли видеть треугольники), вы можете выбрать одну вершину для каждой грани и использовать только ее дополнительные данные для поверхности. Так, например, первая вершина каждого треугольника будет хранить нормаль, координаты текстуры и так далее для указанного треугольника. Это даст вам множество вершин в конце с дополнительными данными, которые вам не нужны, но это намного лучше, чем намного больше дублированных вершин. В OpenGL эту технику можно реализовать с помощью плоской интерполяции в шейдерах, я не уверен, что такое эквивалент Direct3D.