можно не рассчитывать даже на удалёнку от переехавших российских компаний?
Успешная молодая бизнес-вумен сорока лет ищет состоявшегося мужчину-девственника 25 лет с 20-летним опытом в сексе.
aPos + offset
- размерность надо выровнять.uniform vec2 offsets[100];
- какой размер одного элемента? Думаю - 16Б.glGetUniformLocation(...);
- так можно, но загрузка значений для массивов делается иначе.
Любой буфер - это просто кусок данных. Буферы атрибутов - это буквально типизированные массивы.
GLfloat raindrops[]
- тут у тебя закодировано 6 вершин. Ты мог бы сделать и такое объявление:glm::vec3 raindrops[]
, проинициализировав элементы массива должным образом. Разницы было бы никакой.glm::vec2 translations[100]
можно объявить какGLfloat translations[300]
и разницы будет тоже никакой.С т.з. OGL память
translations
и памятьraindrops
- это просто память чтобы заполнить буфер. Под вопросом для GPU остается только то, как эту память нужно интерпретировать чтобы получить атрибуты.Это неправильное понимание процессов. Правильным является такое понимание.
GLfloat raindrops[]
- это данные буфера позиций вершин примитива на стороне CPU.- переносим данные буфера позиций из памяти CPU в память GPU.
- указываем, что каждый атрибут позиции вершины представлен тремя компонентами без нормализации и с типом
float
в буфере, а смещение между двумя атрибутами в буфере равно 12Б(3 * sizeof(GLfloat) == 12
). При этом, базовое смещение внутри буфера до первого атрибута отсутствует.Т.е. этой функцией производится настройка методики выборки атрибутов из буфера. Этот буфер ты связываешь с нулевым потоком атрибутов шейдера, а в шейдере у тебя что? А в шейдере у тебя
layout (location = 0) in vec3 aPos;
, т.е. атрибут на три вещественных компонента.Ровно все то же самое ты проделываешь и для подготовки позиций инстансов, которых тебе хочется сделать 100 штук. Единственное отличие буфера атрибутов примитива от буфера атрибутов инстанса в том, что для буфера атрибутов инстанса надо вызвать
glVertexAttribDivisor
.Тут я ошибся с аргументами, неправильно их вспомнил. Должно быть вот так:
glVertexAttribDivisor(1, 1);
.Т.е. за один инстанс обрабатывается один атрибут этого буфера.
glVertexAttribDivisor(1, 6);
означает что один атрибут обрабатывается за 6 инстансов. Через эту настройку можно управлять группировкой атрибутов между инстансами.Вызов этой функции - это дополнительная инструкция для методики выборки атрибутов.
glVertexAttribDivisor(1, 1);
- выбирать следующий атрибут только для следующего инстанса, а не для следующей вершины.Тут я не смогу тебя направить. Я не пользуюсь VAO потому что всегда пишу кроссплатформенный код. VAO - это нотация OGL, а в DX, MTL и прочих GAPI этой нотации нет. С этим вопросом тебе стоит разобраться самостоятельно, правильно ли у тебя там все. Внешне, насколько я знаю теорию, у тебя там все правильно.
Ты прав, тут несовпадение размерностей. Их надо выровнять. Это я, просто, не сильно старался вычитывать код и кусками его составлял из твоего.
Можно сделать вот так:
vec4(aPos.xy + aOffset, 0.0, 1.0);
.Можно так:
vec4(aPos + vec3(aOffset, 0.0), 1.0);
Вариантов много. Надо просто выбрать правильный для тебя.
Теперь при инстансинге у тебя выборка атрибутов будет такой: сперва пойдет обработка примитива первого инстанса и начнут перебираться атрибуты нулевого потока. Когда все 6 атрибутов будут выбраны, нулевой поток сбросится на начало, в первом потоке произойдет выборка следующего атрибута и пойдет обработка примитива для следующего инстанса.
Все верно. Главным является вызов
glDrawArraysInstanced
. Именно он запускает отрисовку с инстансингом. Все остальное остается как есть, независимо от состояния инстансинга.Т.е. если до отрисовки с инстансингом у тебя рисовался один примитив, то включение инстансинга, как минимум, не должно сломать это поведение.
С его освоением лучше не торопиться. Лучше посмотреть видео и почитать статьи, хоть на том же хабре.
Причину, почему у тебя рисуется только один инстанс, я даже придумать не могу, честно говоря. Чтобы строить догадки, мне нужно самостоятельно запустить код и приглядеться к его поведению. А на это у меня просто нет времени. Думаю, ты это хорошо понимаешь по времени моих комментариев.
Если тебе интересно зайти в графику, то подружись с отладчиком. Чем дальше в этот лес ты пойдешь, тем сильнее он тебе потребуется.