Можно ли скомпилировать только одну шейдерную программу и использовать разные VAO для каждого типа объектов?
Нет прямой связи между программным объектом shader и объектом массива вершин .
Когда выполняется вызов отрисовки, атрибуты вершин, которые определены текущим связанным объектом массива вершин, отрисовываются с использованием установленной в данный момент программы.
Так что да, вы можете использовать одну и ту же шейдерную программу для рисования разного набора вершин, на которые ссылаются разные объекты массива вершин.
[...] оба моих типа объектов используют разные местоположения атрибутов [...]
Атрибут index (location) является активным программным ресурсом и не может быть изменен после связывания шейдерной программы.
Спецификация атрибута вершины (хранящаяся в объекте массива вершин) должна учитывать индексы активных атрибутов программы, но несколько объектов массива вершин могут ссылаться на один и тот же объект (ы) буфера массива вершин.
Можно создавать разные объекты массива вершин, которые ссылаются (совместно используют) на один и тот же объект (ы) буфера вершин, но связывают их с различными местоположениями атрибутов. Но обратите внимание, расположение атрибутов шейдерной программы не может быть изменено.
[...] сфера также использует буфер массива элементов, это вызовет какие-либо проблемы?
Используется ли индексный (элементный) буфер для рисования сетки, зависит от вызова отрисовки (glDrawArrays
или glDrawElements
)