Честно говоря, не совсем понимаю, что из себя представляет этот самый массив из вектор с n=2, загруженный в буфер
GLfloat raindrops[]
- тут у тебя закодировано 6 вершин. Ты мог бы сделать и такое объявление: glm::vec3 raindrops[]
, проинициализировав элементы массива должным образом. Разницы было бы никакой.glm::vec2 translations[100]
можно объявить как GLfloat translations[300]
и разницы будет тоже никакой.translations
и память raindrops
- это просто память чтобы заполнить буфер. Под вопросом для GPU остается только то, как эту память нужно интерпретировать чтобы получить атрибуты.Вот на примере того же квадрата, я загружаю в VBO 6 вершин, указываю шаг в 3 элемента (3 координаты) и на основе этого opengl отрисовывает мне пресловутый квадрат.
GLfloat raindrops[]
- это данные буфера позиций вершин примитива на стороне CPU.glBufferData(GL_ARRAY_BUFFER, sizeof(raindrops), raindrops, GL_STATIC_DRAW);
- переносим данные буфера позиций из памяти CPU в память GPU.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
- указываем, что каждый атрибут позиции вершины представлен тремя компонентами без нормализации и с типом float
в буфере, а смещение между двумя атрибутами в буфере равно 12Б(3 * sizeof(GLfloat) == 12
). При этом, базовое смещение внутри буфера до первого атрибута отсутствует.layout (location = 0) in vec3 aPos;
, т.е. атрибут на три вещественных компонента.glVertexAttribDivisor
.Здесь же я, по сути, делаю то же самое, только aOffset - это какой-то длинный пак данных, в котором я просто указываю шаг через glVertexAttribDivisor(1, 6)?
glVertexAttribDivisor(1, 1);
.glVertexAttribDivisor(1, 6);
означает что один атрибут обрабатывается за 6 инстансов. Через эту настройку можно управлять группировкой атрибутов между инстансами.glVertexAttribDivisor(1, 1);
- выбирать следующий атрибут только для следующего инстанса, а не для следующей вершины.Так же небольшой нюанс возник с VAO, вот, допустим, я передаю те самые 2 (0 и 1) атрибута, т.е. мой VAO будет выглядеть следующим образом
Так же я немного не понял вот эту строчку в шейдере:
vec4(aPos.xy + aOffset, 0.0, 1.0);
.vec4(aPos + vec3(aOffset, 0.0), 1.0);
И немного ещё не разобрался с вызовом, для подобной схемы вызов тех самых инстансов может производиться следующим образом?
glDrawArraysInstanced
. Именно он запускает отрисовку с инстансингом. Все остальное остается как есть, независимо от состояния инстансинга.А насчёт RenderDoc, я, в общем-то, его поставил и вроде как с базовыми механиками подразобрался, но у меня возникло небольшое недопонимание с анализом самого кадра.
можно не рассчитывать даже на удалёнку от переехавших российских компаний?
Успешная молодая бизнес-вумен сорока лет ищет состоявшегося мужчину-девственника 25 лет с 20-летним опытом в сексе.
aPos + offset
- размерность надо выровнять.uniform vec2 offsets[100];
- какой размер одного элемента? Думаю - 16Б.glGetUniformLocation(...);
- так можно, но загрузка значений для массивов делается иначе.
Первый способ - это написать конструктор шаблона класса в C++17 и дальше, типы параметров которого будут взяты из аргументов шаблона.
Второй способ - это написать шаблон функции, типы параметров которой взяты из аргументов шаблона.
У тебя не сделано ни то, ни это. У тебя нет шансов на автоматический вывод шаблонных аргументов.