Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
1

Отвязка буферов для VBO и EBO

19.01.2017, 11:44. Показов 2143. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. У меня вопрос с порядком отвязки буферов для VBO и EBO. Вот пример кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Set up vertex data (and buffer(s)) and attribute pointers
    GLfloat vertices[] = {
        // Positions          // Colors           // Texture Coords
         0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // Top Right
         0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // Bottom Right
        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // Bottom Left
        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // Top Left 
    };
    GLuint indices[] = {  // Note that we start from 0!
        0, 1, 3, // First Triangle
        1, 2, 3  // Second Triangle
    };
    GLuint VBO, VAO, EBO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);
 
    glBindVertexArray(VAO);
 
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
    // Position attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    // Color attribute
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);
    // TexCoord attribute
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
    glEnableVertexAttribArray(2);
 
    glBindVertexArray(0); // Unbind VAO
и код отрисовки:
C++
1
2
3
4
// Draw container
    glBindVertexArray(VAO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    glBindVertexArray(0);
Надо ли отвязывать буфера для VBO и EBO между вызовами glBindVertexArray(VAO); и glBindVertexArray(0);? Если их нужно отвязывать, то делать это надо до отвязки VAO или после (после 36 строки)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2017, 11:44
Ответы с готовыми решениями:

Отрисовка куба через VAO, VBO, EBO
Всем привет Относительно недавно начала изучать OpenGL. Около недели курил glut, теперь перешёл на...

Общий vao (vbo) для различных окон (контекстов)
У меня есть два GL окна, в которые я хочу выводить одни и те же объекты (модели). Если я создал и...

Что лучше для 2D рисования (DL, VBO, VertexArrays, glInterleavedArray, ArrayElement,.)?
Сейчас у меня в программе для отрисовки всего между glBegin и glEnd вызывается в цикле glVertex..,...

редактирование ebo файла
Всем привет. я создаю патч для NHL09 и для него нужно сделать часы которые в игре показывают счет и...

1
3420 / 1607 / 236
Регистрация: 26.02.2009
Сообщений: 7,856
Записей в блоге: 5
19.01.2017, 12:25 2
Лучший ответ Сообщение было отмечено notAll как решение

Решение

Цитата Сообщение от notAll Посмотреть сообщение
Надо ли отвязывать буфера для VBO и EBO
Как я понял, отвязка делается для того чтобы случайно не испортить VBO/EBO снаружи VAO. Так как VAO "помнит" лишь ссылки на данные(VBO/EBO), но "не помнит" сами данные, их(данные в буферах) можно менять почти в любом месте программы не пересобирая сам VAO заново, а это не всегда нужно. Чтобы локализовать редактирование делают отвязку.
Я бы отвязывал их на всякий случай.

Цитата Сообщение от notAll Посмотреть сообщение
до отвязки VAO или после
Для простоты можно запомнить что отвязку и VBO и EBO нужно делать после отвязки VAO.

Подробнее:
EBO нужно отвязывать однозначно после отвязывания VAO, иначе VAO после вызова glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); "запомнит" нулевой EBO, а VBO можно и до отвязки VAO, так как сам вызов glBindBuffer(GL_ARRAY_BUFFER, VBO); не меняет VAO, однако, текущий VBO используется в glVertexAttribPointer и запоминается в VAO именно там. Поэтому unbind VBO нужно делать после всех glVertexAttribPointer.
1
19.01.2017, 12:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2017, 12:25
Помогаю со студенческими работами здесь

Отвязка демона
Доброго времени суток вот такой вапрос у меня есть демон http://cybercomp.ru/ как мне отвезать его...

Отвязка от локального компьютера
Господа подскажите что сделать чтоб база данных в проекте не была привязана к локальному...

Huawei WS319 отвязка от Киевстара
Не могу залить прошивку на микруху Winbond 25Q32FV программатором MiniPro TL866CS, лупит ошибку....

Отвязка ХАСП ключа от программы
День добрый! Программа работает на Windows ХР. Запускается только при вставленном HASP ключе....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru