ПрограммированиеФорумГрафика

VAO OpenGL + шейдеры - пара-тройка вопросов (2 стр)

Страницы: 1 2
#15
15:09, 10 июля 2013

Ура блин, я есть радостный, как ребёнок с чупачупсом. Всё получилось, как оно и хотелось.
Красотуля какая :)
Cool | VAO OpenGL + шейдеры - пара-тройка вопросов
Для корректного нормалмапа пришлось разбираться, что за зверь такой VBA, и как заставить шейдер мой атрибут видеть как атрибут, а не как юниформ для всего полигона(чтоб T и B передать для каждой вершины).
Вобщем, если кому нужно, распишу что и как у меня делается, для того чтоб нормалмап был всегда корректный, даже если текстура на полигоне скошена или вообще перевёрнута зеркально. И независимо от положения модели в пространстве.

Будем считать, что в модельке всего один меш, и хранит только вертексы и текстурные координаты, нормали сами посчитаем.
Итого после загрузки у нас будут заполнены массивы координат, текстурных координат и массив индексов. Если в файле модельки прописано для меша, что нормали не сглажены, то расчитываем нормали простым cross:

+ Показать

Либо высчитываем сглаженные нормали:

+ Показать

После расчёта нормалей, нужно расчитать векторы T и B касательного пространства:

+ Показать
#16
15:10, 10 июля 2013

Затем нужно это всё нарисовать:
буферы уже приготовленных атрибутов

+ Показать

Так же нужны переменные для хранения индексов переменных атрибутов в шейдере

+ Показать

Для идентификаторов буферов VBO на каждый атрибут(атрибуты разделены по разным буферам)

+ Показать

До рендеринга нужно получить индексы переменных атрибутов в шейдере, чтоб привязать к нашим будущим буферам(прога шейдеров уже создана)

+ Показать

Затем создаём наши буферы в видеопамяти по данным наших массивов с атрибутами

+ Показать

И при рендеринге пишем:

+ Показать

Сам код шейдеров такой:
вершинный

+ Показать

фрагментный шейдер, тут я с моделью освещения немного помудрил

+ Показать
#17
10:35, 12 июля 2013

Почему может происходить краш? Пытаюсь все настройки зопехнуть в 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);
  }
 
}
Прошло более 3 лет
#18
23:15, 11 сен 2016

UVW
> Почему может происходить краш?
Некрофактум: вао не поддерживался той интеловской ноутбучной видяхой. Всегда проверяйте используемые спорные расширения на факт поддержки железкой.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.