Я знаю одну вескую причину предпочесть явное определение местоположения.
Учтите, что вы храните свои геометрические данные в объектах Vertex Array Objects. Для данного объекта вы создаете VAO таким образом, чтобы индексы соответствовали, например:
- индекс 0 : позиции,
- индекс 1 : нормали,
- индекс 2 : texcoords
Теперь представьте, что вы хотите нарисовать один объект двумя разными шейдерами . Один шейдер требует в качестве входных данных позиции и нормальных данных , другой - позиции и координаты текстуры .
Если вы скомпилируете эти шейдеры, вы заметите, что первый шейдер будет ожидать позиции с индексом атрибута 0 и нормали с индексом 1. Другой будет ожидать позиций с 0, а координаты текстуры с 1.
Цитата https://www.opengl.org/wiki/Vertex_Shader :
Автоматическое присвоение
Если ни один из двух предыдущих методов не назначает входные данные индексу атрибута, то индекс автоматически назначается OpenGL при связывании программы. Присваиваемый индекс является совершенно произвольным и может отличаться для разных связанных программ, даже если они используют один и тот же код вершинного шейдера.
Это означает, что вы не сможете использовать свой VAO с обоими шейдерами. Вместо того, чтобы иметь один VAO для, скажем, объекта, вам понадобится - в худшем случае - отдельный VAO для каждого объекта на шейдер .
Заставив шейдеры использовать собственное соглашение о нумерации атрибутов, glBindAttribLocation
можно легко решить эту проблему - все, что вам нужно сделать, это сохранить согласованную связь между атрибутами и их установленными идентификаторами и заставить шейдеры использовать это соглашение при связывании.
(На самом деле это не большая проблема, если вы не используете отдельные VAO, но все же может сделать ваш код более понятным.)
Кстати:
При настройке расположения атрибутов для программы шейдера OpenGL вы сталкиваетесь с двумя вариантами
В OpenGL / GLSL 3.3 есть третий вариант: указать местоположение непосредственно в коде шейдера . Выглядит это так:
layout(location=0) in vec4 position;
Но этого нет в языке шейдеров GLSL ES.
glBindAttribLocation
свой графический движок, который отлично работал в Linux. Когда я портировал в окна, он использовал мои нормали в качестве вершин - мне пришлось явно указать ему порядок переменных в моем шейдере,glBindAttribLocation
чтобы заставить его работать ...