Мне нужен способ передать массив в шейдер Вершины, который содержит несколько значений для каждой вершины. у меня есть это:Передача вершинного массива любого количества значений в GLSL Vertex Shader
- Один массив 3d точек
- Один массив 3d нормалей для каждой точки
- Один массив граней (все треугольники)
- Один массив всех соседских нормалей для каждого вершина. Если вершина i имеет 4 соседства, этот массив имеет 4 3d нормалей для вершины (нормали каждого из 4 соседей). Для простоты я создал этот массив, как будто все вершины имеют одинаковое количество соседей (максимум из модели, 4 в следующем примере).
Таким образом, структура выглядит следующим образом:
- массив точек = v0 v1 v2 v3 v4 ...
- массив нормалей = n0 n1 n2 n3 n4 ...
- массив граней = [0 1 2] [0 3 1] [0 4 3] ...
- массив нормалей окрестности = [n1 n2 n3 n4] [n0 n2 n3 0] [n0 n1 0 0] [ n0 n1 n4 0] [n0 n4 0 0] [n0 n3 0 0] ...
В примере максимальная окрестность равна 4, поэтому я заполняю все нормальные данные 0-векторами (0.0, 0.0, 0.0) для тех, у кого нет 4 соседей. В общем случае у меня более четырех соседей на вершину. В текущей модели у меня есть несколько вершин с 14 соседями, поэтому мне нужно 14 нормалей или 42 поплавка для каждой вершины).
В заголовке VS, у меня есть:
layout (location = 0) in vec3 in_Position;
layout (location = 1) in vec3 in_Normal;
layout (location = 2) in XXX in_NeighborsNormals
Но я не знаю, что использовать в XXX для того, чтобы сказать затенение, что данные не является vec3, vec4, mat4 и т. д., но массив (известный размер времени компиляции) vec3.
EDIT: Может быть, с помощью ВАО это не путь к NeighborsNormals. Я открыт для предложений, но мне нужно знать конкретный индекс текущей вершины, чтобы получить доступ к правильным значениям.
Цель этого состоит в вычислении кривизны области вокруг вершины, чтобы Tessellate с использованием тесселяции шейдеров. В частности, я хотел бы воспроизвести эту работу: http://perso.telecom-paristech.fr/~boubek/papers/VDTess/
Я использую C++ и OpenGL 4.0, но я мог бы перейти к OpenGL 4.3. Я исхожу из промежуточного знания OpenGL 2.0, но GLSL (старый или современный) является новым (примерно через несколько месяцев) для меня.
Заранее спасибо.
* «Один массив из ВСЕХ нормалей окрестности для каждой вершины. [...]» * Могу ли я спросить, почему вы этого хотите? Это похоже на работу для геометрических шейдеров, где, если вы используете примитивный тип смежности, вы можете просто извлечь из вершинного потока во время примитивной сборки. –
Мне нужно знать все нормали, чтобы использовать их в Tessellation Control Shader. Геометрический шейдер приходит после Tessellation, и это не поможет мне:/ – fern17
Хорошо, поэтому важно понять, что вы не можете использовать массивы для атрибутов вершин. Если вы настаиваете на том, чтобы делать это таким образом, вы можете **, однако, сделать что-то вроде хаки - упаковать свой массив из 4 соседних 'vec3' в матрицу 4x4. Поймите, однако, что атрибут vertex 'mat4' занимает 4 слота атрибута - они не дешевые. Если вы хотите получить действительно фантазию, вы, вероятно, можете использовать последний столбец матрицы 4x4 для упаковки '5' vec3> :) –