Работает на картах NVIDIA, потому что NVIDIA неправильно реализует спецификацию OpenGL.
glVertexAttrbDivisorARB
работает только на универсальных атрибутах . То есть определяемые пользователем атрибуты шейдера. Он не работает с любыми атрибутами, отличными от указанных glVertexAttrib(I)Pointer
.
NVIDIA давно внедрила поведение псевдонимов атрибутов. Это gl_MultiTexCoorc[0]
также имеет индекс атрибута 8. Это gl_Vertex
, ввод позиции вершины, имеет индекс атрибута 0.
Проблема? Спецификация OpenGL не допускает этого. В частности, требуется, чтобы реализации терпели неудачу и выдавали ошибку, если вы пытаетесь это сделать. Когда вы вызываете glDraw*
с этими настроенными массивами, ваша реализация должна выдавать ошибку.
К сожалению, вы попали в ловушку NVIDIA: использование неспецифического поведения, которое, как оказалось, работает на их драйверах. Я предполагаю, что вы, должно быть, поняли идею из какой-то бумаги NVIDIA. Так что теперь вам нужно изменить весь код, чтобы использовать пользовательские атрибуты вместо встроенных.
О, и если вам интересно, где в спецификации написано это, см. Профиль совместимости OpenGL 3.3, стр. 94, самое нижнее:
Невозможно связать общие атрибуты с обычными.