glVertexAttribDivisor и индексный ввод - PullRequest
9 голосов
/ 01 сентября 2011

Ребята, я пытаюсь использовать glVertexAttribDivisor в моем экземпляре OpenGL.

Он работает на NV-карте, но не работает на ATI-карте.Ничего не рисует.

В GlExtensionViewer показано, что обе эти карты поддерживают glVertexAttribDivisor / InstancedStream.При запуске не было ошибок.

Я не знаю, связано ли это с моим неправильным использованием.

Я помещаю данные экземпляра в отдельный буфер массива вершин, затем отображаю их в gl_MultiTexCoord0~ 3.Данные экземпляра - это матрица мира.

Код здесь.

    for( int i=0;i<3;i++)
    {
        glClientActiveTexture(kGL_TEXTURE0 + i);
        glTexCoordPointer(size, type, stride, i*4*sizeof(float));

        int instanceVertexAttribIndex = i + 8;
        glVertexAttribDivisorARB(instanceVertexAttribIndex, 1);
    }

Ключевой вопрос заключается в том, какой правильный «индекс» я должен дать glVertexAttribDivisorARB, если я попытаюсь поместить данные экземплярана gl_MultiTexCoord0?

1 Ответ

13 голосов
/ 01 сентября 2011

Работает на картах NVIDIA, потому что NVIDIA неправильно реализует спецификацию OpenGL.

glVertexAttrbDivisorARB работает только на универсальных атрибутах . То есть определяемые пользователем атрибуты шейдера. Он не работает с любыми атрибутами, отличными от указанных glVertexAttrib(I)Pointer.

NVIDIA давно внедрила поведение псевдонимов атрибутов. Это gl_MultiTexCoorc[0] также имеет индекс атрибута 8. Это gl_Vertex, ввод позиции вершины, имеет индекс атрибута 0.

Проблема? Спецификация OpenGL не допускает этого. В частности, требуется, чтобы реализации терпели неудачу и выдавали ошибку, если вы пытаетесь это сделать. Когда вы вызываете glDraw* с этими настроенными массивами, ваша реализация должна выдавать ошибку.

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

О, и если вам интересно, где в спецификации написано это, см. Профиль совместимости OpenGL 3.3, стр. 94, самое нижнее:

Невозможно связать общие атрибуты с обычными.

...