Ура блин, я есть радостный, как ребёнок с чупачупсом. Всё получилось, как оно и хотелось.
Красотуля какая :)
Для корректного нормалмапа пришлось разбираться, что за зверь такой VBA, и как заставить шейдер мой атрибут видеть как атрибут, а не как юниформ для всего полигона(чтоб T и B передать для каждой вершины).
Вобщем, если кому нужно, распишу что и как у меня делается, для того чтоб нормалмап был всегда корректный, даже если текстура на полигоне скошена или вообще перевёрнута зеркально. И независимо от положения модели в пространстве.
Будем считать, что в модельке всего один меш, и хранит только вертексы и текстурные координаты, нормали сами посчитаем.
Итого после загрузки у нас будут заполнены массивы координат, текстурных координат и массив индексов. Если в файле модельки прописано для меша, что нормали не сглажены, то расчитываем нормали простым cross:
Либо высчитываем сглаженные нормали:
После расчёта нормалей, нужно расчитать векторы T и B касательного пространства:
Затем нужно это всё нарисовать:
буферы уже приготовленных атрибутов
Так же нужны переменные для хранения индексов переменных атрибутов в шейдере
Для идентификаторов буферов VBO на каждый атрибут(атрибуты разделены по разным буферам)
До рендеринга нужно получить индексы переменных атрибутов в шейдере, чтоб привязать к нашим будущим буферам(прога шейдеров уже создана)
Затем создаём наши буферы в видеопамяти по данным наших массивов с атрибутами
И при рендеринге пишем:
Сам код шейдеров такой:
вершинный
фрагментный шейдер, тут я с моделью освещения немного помудрил
Почему может происходить краш? Пытаюсь все настройки зопехнуть в VAO и собственно делаю это так:
буферы уже созданы и заполнены
// генерация VAO ext->glGenVertexArrays(1, &mesh[i].VAO); ext->glBindVertexArray( mesh[i].VAO); ext->glEnableVertexAttribArray( attr_pos); ext->glBindBuffer( GL_ARRAY_BUFFER, mesh[i].VBOvertex ); ext->glVertexAttribPointer( attr_pos, 3, GL_FLOAT, false, sizeof( Vector3f), 0); ext->glEnableVertexAttribArray( attr_tcoord); ext->glBindBuffer( GL_ARRAY_BUFFER, mesh[i].VBOtexcoord ); ext->glVertexAttribPointer( attr_tcoord, 2, GL_FLOAT, false, sizeof( Vector2f), 0); ext->glEnableVertexAttribArray( attr_tan); ext->glBindBuffer( GL_ARRAY_BUFFER, mesh[i].VBOtangent ); ext->glVertexAttribPointer( attr_tan, 3, GL_FLOAT, false, sizeof( Vector3f), 0); ext->glEnableVertexAttribArray( attr_norm); ext->glBindBuffer( GL_ARRAY_BUFFER, mesh[i].VBOnormal ); ext->glVertexAttribPointer( attr_norm, 3, GL_FLOAT, false, sizeof( Vector3f), 0); ext->glEnableVertexAttribArray( attr_binorm); ext->glBindBuffer( GL_ARRAY_BUFFER, mesh[i].VBObinormal ); ext->glVertexAttribPointer( attr_binorm, 3, GL_FLOAT, false, sizeof( Vector3f), 0); ext->glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mesh[i].VBOindex); ext->glBindVertexArray( 0); //отбиндиваем, чтоб далее случайно не пихнуть в массив чего лишнего
При отрисовке:
void StaticModel::Render() { for ( int i=0; i<m_count; i++) { //подключим нужные текстуры shader->SetTexture( 0,mesh[i].texID,"TextureSampler"); shader->SetTexture( 1,mesh[i].normmapID,"NormalSampler"); ext->glBindVertexArray( mesh[i].VAO); //для каждого меша свой VAO glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, NULL); ext->glBindVertexArray( 0); } }
UVW
> Почему может происходить краш?
Некрофактум: вао не поддерживался той интеловской ноутбучной видяхой. Всегда проверяйте используемые спорные расширения на факт поддержки железкой.
Тема в архиве.