glDrawArraysInstanced.if ((result.x < -0.5 && result.y > -0.5) || (result.x > 0.5 && result.y > -0.5) || (result.x >= -0.5 && result.x <= 0.5 && result.y > 0.5))
gl_Position = result;discard можно применять только в пиксельном шейдере. Преждевременный return без установки gl_Position ведет к неопределенному поведению. gl_Position нужно всегда определять.gl_Position = vec4( -1.0, -1.0, -1.0, 0.0 ); не портит порядок обработки вершин. Если это сделать для всего примитива, то он будет выброшен из дальнейшей обработки целиком. Всем привет.
Новичок в программировании, изучаю unreal, вместе с ним с++.
логи я читать не умею, поэтому вообще не понимаю, что делать((.
template<typename T>
bool at(T*& storage, size_t n);true только когда заполнил storage правильным значением.Здравствуйте, господа.
Не кидайте камнями, если похожий вопрос был.
Честно говоря, не совсем понимаю, что из себя представляет этот самый массив из вектор с 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(...); - так можно, но загрузка значений для массивов делается иначе.
Это потому что сейчас у тебя что-то сделано, прямо скажем, неправильно. :)
Для завершения своего прошлого этапа ты пришел к определенному решению и сделал определенные действия. Это привело к тому, что для тебя текущий твой этап стал нерешаемым стандартными методами.
Это нормально. Так работает метод проб и ошибок.
Тебе надо откатиться назад и решить прошлый этап иначе. Одна матрица на весь массив инстансов - это легкое решение, которое не решает ничего. В буквальном смысле ты закрыл себе дорогу к разным траекториям движения капель, к эффектам ветра, к определению столкновений капель. Много к чему.
Эта матрица означает что весь массив капель является единым неразрывным объектом, с которым взаимодействовать можно только целиком.
Матричное преобразование - тяжелая штука. Тебе же на CPU нужно работать с значениями
aOffset, именно они у тебя сейчас обозначают физическую позицию каждой капли. Посчитать 2D координату проще даже для 200к инстансов чем посчитать матрицу и выполнить с ней операцию на всех инстансах. А передается твой буферaOffsetна GPU сравнительно так же быстро, как и та же матрица. Иными словами, матрица - это просто альтернативное решение. Неудачное альтернативное решение.Когда на CPU посчитаешь все 200 точек капель для очередной их отрисовки, у тебя появятся все нужные данные чтобы проверить коллизии каждой капли по отдельности все на том же CPU.