2016-01-07 1 views
0

У меня есть структура 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. Здесь я зашел в тупик. Любые идеи, что может быть неправильным или как я могу продолжить дальнейшую отладку?

+0

Эй, я не делаю много C++, но это выглядит неправильно: if (i == 0) OFFSETS [0] = 0; OFFSETS_I [0] = 0 ;. Поскольку ваш оператор if не имеет {}, вторая строка выполняется независимо от того, равен ли я равен 0. Я считаю хорошей практикой воздерживаться от использования этих выражений if вообще, хотя многие люди не согласны. –

+0

Классический пример того, что происходит, когда вы печатаете на планшете ... Скопируйте код с моего ноутбука. Спасибо за указание, потому что другие пользователи могут подумать, что проблема –

ответ

0

Оказалось, что это связано с ошибкой в ​​моем драйвере. Тот же код работал на компьютере моего коллеги.

Смежные вопросы