Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL, VAO, VBO (2 стр)

OpenGL, VAO, VBO (2 стр)

Страницы: 1 2
Daniil PetrovПостоялецwww13 мар. 20185:59#15
war_zes
> а зачем ты это делаешь для индексного буфера?
Первоначально когда-то делал по этим урокам. Без растаскивания всё прекрасно работало, а раздельно теперь и без
glEnableVertexAttribArray(INDEX_BUFFER); 
glVertexAttribPointer(INDEX_BUFFER, 3, GL_UNSIGNED_INT, GL_FALSE, 0, NULL); 
не работает. Точнее даже уже после
glVertexArrayElementBuffer(vao, vbo[VERTEX_BUFFER]);
glEnableVertexAttribArray(VERTEX_BUFFER);
glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
выскакивает GL_INVALID_OPERATION, так что здесь что-то в корне неправильно.

Правка: 13 мар. 2018 6:01

war_zesПостоялецwww13 мар. 20186:25#16
Daniil Petrov
glEnableVertexAttribArray и glVertexAttribPointer отвечают за атрибуты вершин в шейдере.
они не имеют никакой связи с индексным буфером

Daniil Petrov
> Первоначально когда-то делал
ну так где ты там нашел что индексному буферу надо описывать атрибут вершины?
смотри внимательней
http://www.mbsoftworks.sk/tutorials/opengl3/05-indexed-drawing/


Что ты сейчас делаешь:

В шейдере у тебя написан набор атрибутов
in vec3 inVertex;
in vec3 inNormal;
in vec2 inTexCoord;
Это атрибуты вершины (можешь даже заметить в имени функции слова "VertexAttrib")

Теперь ты пишешь:

glEnableVertexAttribArray(INDEX_BUFFER);
glVertexAttribPointer(INDEX_BUFFER, 3, GL_UNSIGNED_INT, GL_FALSE, 0, NULL);

Что думает OGL на это? он думает что у тебя не три атрибута, а четыре(!!!). четвертый ты включаешь glEnableVertexAttribArray(INDEX_BUFFER);
А теперь еще раз читай про индексные буферы. тебе не надо для этого описывать атрибут вершины. Поэтому эти две строчки ненужные, а в твоем случае и привели к краху

Правка: 13 мар. 2018 6:29

war_zesПостоялецwww13 мар. 20186:28#17
Daniil Petrov
> Первоначально когда-то делал
Вот смотри как там описывают вершинный буфер и вао
glBindVertexArray(uiVAOHeightmap); 
glBindBuffer(GL_ARRAY_BUFFER, uiVBOHeightmapData); 
....
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3)*HM_SIZE_X*HM_SIZE_Y, vHeightmapData, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

А вот как индексный:

glGenBuffers(1, &uiVBOIndices); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, uiVBOIndices); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(iIndices), iIndices, GL_STATIC_DRAW); 

То есть никаких glEnableVertexAttribArray и glVertexAttribPointer.

Правка: 13 мар. 2018 6:30

Daniil PetrovПостоялецwww13 мар. 20186:35#18
war_zes
Вот так нормально заработало:
+ Показать

Тут уже какая-то загвоздка с самим glVertexArrayElementBuffer получается... но главная задача решена - наконец и загрузку моделек полностью выкинул из главного потока!
Теперь уже попробую разобраться с тем, что ты написал :)

Правка: 13 мар. 2018 6:35

war_zesПостоялецwww13 мар. 20187:00#19
Daniil Petrov
> Вот так нормально заработало:
А еще раз говорю что так делать нельзя (можно только если понимаешь что ты делаешь), а именно нельзя
glEnableVertexAttribArray(INDEX_BUFFER);
glVertexAttribPointer(INDEX_BUFFER, 3, GL_UNSIGNED_INT, GL_FALSE, 0, NULL);

Daniil Petrov
изучай
https://github.com/g-truc/ogl-samples/blob/e3fb43e2aff51aeb963224… te-access.cpp

Смотри функцию initVertexArray()

    glCreateVertexArrays(1, &VAO);

// это описывают атрибуты вершин
    glEnableVertexArrayAttrib(VAO, semantic::attr::POSITION);
    glVertexArrayAttribBinding(VAO, semantic::attr::POSITION, 0);
    glVertexArrayAttribFormat(VAO, semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, 0);

    glEnableVertexArrayAttrib(VAO, semantic::attr::TEXCOORD);
    glVertexArrayAttribBinding(VAO, semantic::attr::TEXCOORD, 0);
    glVertexArrayAttribFormat(VAO, semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2));

// а вот это индексный буфер
    glVertexArrayElementBuffer(VAO, BufferName[buffer::ELEMENT]);
    glVertexArrayVertexBuffer(VAO, 0, BufferName[buffer::VERTEX], 0, sizeof(glf::vertex_v2fv2f));

Внимательно смотри как тут описаны атрибуты вершин и как индексный буфер

Правка: 13 мар. 2018 7:04

DampireПостоялецwww13 мар. 20187:27#20
MrShoor
> Что за default vao? 0 который? Не во всех реализациях OGL ES можно биндить
> ноль. Некоторые выдают INVALID_OPERATION если попытаться забиндить 0.
+ Показать

При биндинге или таки при вызове связанных с VAO функций? Потому что в компатибилити профайле opengl создается 0 vao и там можно рисовать в старом стиле. В корке 0 - отвязывает любой vao и любая операция связанная с vao (например с биндингом индексов) работать не будет.
Daniil PetrovПостоялецwww13 мар. 20188:38#21
war_zes
Посмотрел пример по твоей ссылке, он меня очень впечатлил, но я настолько ещё не прозрел :))) останусь пока при своём коде, удалив строчки, на которые ты указал.
Но ссылку сохранил, опыта наберусь, код обязательно усовершенствую :)
war_zesПостоялецwww13 мар. 20188:43#22
Daniil Petrov
> Посмотрел пример по твоей ссылке, он меня очень впечатлил, но я настолько ещё
> не прозрел :))) останусь пока при своём коде, удалив строчки, на которые ты
> указал.
> Но ссылку сохранил, опыта наберусь, код обязательно усовершенствую :)
рекомендую полную ссылку сохранить
https://github.com/g-truc/ogl-samples/tree/master/samples

там рассмотрены разные базовые вещи языка на каждой версии.

на самом деле ничего сложного там нет - просто показывают как юзать OGL на той или иной версии не смешивая стили

Daniil PetrovПостоялецwww13 мар. 20189:44#23
war_zes
Благодарю :)
Страницы: 1 2

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

2001—2018 © GameDev.ru — Разработка игр