2016-03-20 2 views
0

Я изучаю OpenGL самостоятельно, а некоторые понятия в OpenGL меня смущают.Понимание VAO, VBO и программы

Я понимаю, что VBO является буфером на стороне сервера для неописанных данных, VAO - это описание VBO, а Программа - конвейер визуализации шейдеров, используемый для отображения сеток на экране.

Что меня смущает, так это отношения между всеми тремя из них, как я вижу, после создания и заполнения VBO, VAO является сгенерированной для спецификации атрибутов программы. означает ли это каждый раз, когда мы связываем VAO, мы должны использовать определенную программу впереди? пожалуйста, исправьте меня, если это неверно. и некоторое краткое введение об интерактивности между этими концепциями OpenGL было бы замечательным.

благодаря

ответ

2

это значит каждый раз, когда мы связываем с ВАО, мы должны использовать определенную программу вперед

VAO описывает (среди прочего) format of vertex data. Как часть этого формата, он описывает, какие данные относятся к атрибутам вершин. Он делает это, назначая атрибуты «местоположения».

Ваш вершинный шейдер имеет число user-defined input variables. Каждому этому входу назначается «местоположение».

При визуализации формат вершин определяет, какие входы VS заполнены, в зависимости от местоположений, которые соответствуют. Поэтому вам не нужно ограничивать использование VAO конкретным VS. Но вы должны использовать VAO с программой . Один из них имеет входные данные, соответствующие местоположениям формата.

Если ваше VAO указывает, что местоположения атрибутов 0, 1 и 4 будут заполняться данными с плавающей запятой, то любые VS, которые вы используете с этим VAO, должны быть совместимы с этим. Технически не нужно фактически использовать местоположения 0, 1 или 4, но если это так, они должны использовать значения ввода с плавающей запятой. Любые неиспользуемые местоположения, предоставленные форматом, будут эффективно игнорироваться (хотя они почти наверняка будут прочитаны из буфера).

Если VAO помещает данные с плавающей запятой в атрибуты 0, 1 и 4, но VS ожидает беззнаковые целочисленные данные в атрибуте 1, тогда у вас есть проблема.