Передача параметров в списки отображения OpenGL
Мне было интересно, есть ли какой-либо способ (стандартный или хитрый трюк) для передачи параметров в список отображения OpenGL. Позвольте мне показать пример, чтобы уточнить, что я имею в виду.
Предположим, у нас есть следующий код:
GLuint l = glGenLists(1);
glNewList(l, GL_COMPILE);
// ...some OpenGL function calls
glBindTexture(GL_TEXTURE_2D, some_texture); // <-- here, I want `some_texture' to be a parameter that I can set when calling the display list
//...some more stuff...
glEndList();
Есть ли способ сделать то, что я хочу?
2 ответа
Ну, да, связанная текстура является глобальным состоянием, и если вы связываете текстуру, а затем вызываете список отображения, текстура все равно должна быть связана, когда список выполняется.
Но лучше перестать использовать списки отображения и использовать VA /VBO, я рекомендую их!
Это не сработает. Обязательно внимательно прочтите спецификацию и часто задаваемые вопросы, в частности:
GL может быть проинструктирован обрабатывать конкретный список отображения (возможно, многократно), предоставляя номер, который однозначно его определяет. Это приводит к тому, что команды в списке будут выполняться так же, как если бы они были заданы нормально. Единственное исключение относится к командам, которые зависят от состояния клиента. Когда такая команда накапливается в списке отображения (то есть, когда она выполняется, а не когда выполняется), к ней применяется состояние клиента, действующее в то время.
16.010 Почему список отображения занимает так много памяти? Список отображения OpenGL должен сделать копию всех данных, необходимых для воссоздания последовательности вызовов, которая его создала.
Другими словами, если вы планируете изменить хранилище данных текстуры позже, это не будет иметь никакого значения, потому что OpenGL сохраняет свою собственную копию, чтобы гарантировать, что он может точно воспроизводить то, что было текущим состоянием.
Единственный способ внести некоторую изменчивость в списки отображения - использовать вложенный прием отображения, но, как уже предложил Матиас Вальденегро, вам не следует использовать списки отображения вообще, если вы можете помочь. Другие функции (например, VBO) являются более гибкими и имеют такую же или лучшую производительность.