Я пишу движок в OpenGL 3.2+. Визуализируемый объект имеет сетку (a.k.a VAO) и пару материалов (a.k.a Shaders and Programs). Все визуализируемые объекты хранятся в очереди рендеринга, которая сортирует процесс рендеринга материалов и мешей таким образом, что требуется наименьшее количество вызовов привязки OpenGL.
Однако иногда он связывает объекты, которые уже связаны, мой вопрос: автоматически ли OpenGL обнаруживает, когда вы пытаетесь связать объект, который уже связан, и пропускает ли он все дорогостоящие операции, или вам нужно внедрить систему для определить, связан ли объект с самим собой?
Если OpenGL не обнаруживает это, возможно ли быстрее извлечь имя объекта через glGet * и сравнить с объектом, который вы пытаетесь связать, или просто отслеживать текущий связанный объект самостоятельно?
Я не верю, что спецификация требует выполнения таких проверок, но каждая крупная реализация делает. Однако, если вы решили сделать это самостоятельно — почему бы просто не хранить ценности самостоятельно? У glGet нет особого интереса здесь. Кстати, материал и шейдер не одно и то же.
Обычно, когда вы что-то включаете, вам нужно отключить это, когда вам это не нужно. Поэтому ответ таков: вы должны следить за тем, что делается в программе.
Простейший пример, который я могу придумать:
glEnable(GL_TEXTURE_2D);
glBindTexture( 0, id );
// render
glDisable(GL_TEXTURE_2D);