У меня есть структура Vertex {glm :: vec4 t, n, v;}. Я написал загрузчик obj, который принимает два параметра, obj путь к файлу как строку и ссылку на вектор «Вершины». Эта функция заполняет мой вектор и возвращает количество индексов (в любом случае, индексы - это только порядковые номера).Последовательные команды рисования с glVertexAttribBinding не работают как ожидалось
Поскольку у меня есть 6 объектов для рендеринга, после использования этой функции 6 раз я следующий
vector<Vertex> objects[6];
GLint SIZES[6],OFFSETS[6],SIZES_I[6],OFFSETS_I[6];
заполнены. РАЗМЕРЫ - это число «Вершины» (объект [i] .size()), а SIZES_I - количество индексов. Смещение рассчитывается как ниже
for(int i=0;i<6;i++)
{
if(i==0)
{
OFFSETS[0]=0;OFFSETS_I[0]=0;
}
else
{
OFFSETS[i]=OFFSETS[i-1]+SIZES[i-1];
OFFSETS_I[i]=OFFSETS_I[i-1]+SIZES_S[i-1];
}
}
Я передал векторы Vertex в один VBO все спина к спине. Аналогично для индексов, передаваемых в буфер, связанных с буфером массива элементов. Эта часть показана ниже.
glBufferData(GL_ARRAY_BUFFER,(OFFSETS[5]+SIZES[5])*sizeof(Vertex),data,GL_STATIC_DRAW);
for(int i=0;i<6;i++)
{
glBindVertexBuffer(i,buffer[0],OFFSETS[i]*sizeof(Vertex),sizeof(Vertex));
}
glBufferData(GL_ELEMENT_ARRAY_BUFFER,(OFFSETS_I[5]+SIZES_I[5])*sizeof(GLuint),indices,GL_STATIC_DRAW);
glVertexAttribFormat(0,4,GL_FLOAT,GL_FALSE,offsetof(Vertex,v));
Теперь наступает моя проблема. Из двух кодов рендеринга, показанных ниже, первый не работает, но второй работает отлично.
for(int i=0;i<6;i++)
{
glVertexAttribBinding(0,i);
glDrawElements(GL_TRIANGLES,SIZES_I[i],GL_UNSIGNED_INT,reinterpret_cast<void*>(OFFSETS_I[i]*sizeof(GLuint));
}
//second
glVertexAttribBinding(0,0);
for(int i=0;i<6;i++)
glDrawElementsBaseVertex(GL_TRIANGLES,SIZES_I[i],GL_UNSIGNED_INT,reinterpret_cast<void*>(OFFSETS_I[i]*sizeof(GLuint)),OFFSETS[i]);
Чтобы вкратце сказать, что я сделал так, у ребят можете понять, что происходит здесь, в первом случае я создал 6 буферных привязки на тот же буфер с 6 зачетов. Во втором случае есть только одна привязка, но я использовал базовую вершину для смещения 6 раз. Btw оба компилируются, поэтому игнорируйте любые опечатки, когда я ввел все это в свою вкладку.
Моя первая попытка отладки: Поскольку базовый вершинный подход работает, obj loader в порядке. В любом случае, чтобы убедиться в этом, я просто загрузил одну модель. Его работа прекрасна.
Моя вторая попытка отладки: Мое подозрение, естественно, упало на привязку вызовов и смещений. Чтобы разрешить это, я удалил цикл for в первом методе и инициализировал i с помощью 0 (поскольку второй метод, то есть метод базовой вершины, мы не беспокоимся об этом). Моя первая модель появилась на экране. Затем я инициализировал переменную «i» с 1. Моя вторая модель была отображена на экране. Это я повторил до i = 5. Каждая из моих 6 моделей была отображена правильно. Поэтому мои модели отображались индивидуально. Но когда я совмещаю свои вызовы последовательно, я получаю несколько полных моделей, некоторые частичные модели, а некоторые нет.
Моя третья попытка отладки: Кажется, что отображаются только последние 2 модели и так далее. Остальные не нарисованы или частично не нарисованы. Поэтому я отменил цикл for, начиная с i = 5 и декрементируя. Теперь отображаются первые 2 модели и так (здесь «первые два» и «последние два» относятся к порядку, в котором модели загружаются в obj-ридере. Я этого не изменил). Как будто последующие команды рисования каким-то образом приводят к исчезновению работы предыдущих команд рисования. Вроде.
Thats it. Здесь я зашел в тупик. Любые идеи, что может быть неправильным или как я могу продолжить дальнейшую отладку?
Эй, я не делаю много C++, но это выглядит неправильно: if (i == 0) OFFSETS [0] = 0; OFFSETS_I [0] = 0 ;. Поскольку ваш оператор if не имеет {}, вторая строка выполняется независимо от того, равен ли я равен 0. Я считаю хорошей практикой воздерживаться от использования этих выражений if вообще, хотя многие люди не согласны. –
Классический пример того, что происходит, когда вы печатаете на планшете ... Скопируйте код с моего ноутбука. Спасибо за указание, потому что другие пользователи могут подумать, что проблема –