Почему для равномерных переменных нет эквивалента glBindAttribLocation()?

Я изучаю OpenGL и замечаю, что у меня есть возможность использовать либо glGetAttribLocation(), либо glBindAttribLocation() при работе с атрибутами ввода, но для униформы, я должен использовать glGetUniformLocation(). Есть ли какая-либо техническая причина для того, чтобы не включать glBindUniformLocation() в API?

Ответ 1

Для начала, помимо вызова функции типа glUniform* (...), чтобы установить значение равномерности, с ними не может быть ничего другого. Униформы не существовали до GLSL.

Атрибуты в OpenGL вернутся к GL_ARB_vertex_program ассемблеру (там, где атрибуты имели номера вместо имен). Фактически, когда это было впервые добавлено в GL, эти индексы были добавлены к традиционным указателям с фиксированной функцией (например, 0 == glVertexPointer (...), 2 == glNormalPointer (...), 3 == glColorPointer (...)), чтобы программы вершин можно было легко отбросить в существующие приложения. GLSL повторно использовал части API, которые выдвигали расширения языка ассемблера (это случается очень часто).

Стоит отметить, что в GLSL только 1 псевдоним гарантируется/разрешен в совместимой реализации и 0 (многие драйверы, в частности, NV, больше похожи на псевдоним). При смешивании и сопоставлении фиксированных функций и программируемых атрибутов вершин важно избегать индексов, которые относятся к другим используемым указателям, и для этого требуется возможность вручную устанавливать местоположения.

Однако, что еще важнее, возможность явного определения общих расположений атрибутов вершин позволяет более удобно адаптировать программы GLSL к жестко определенным данным. Вместо того, чтобы настраивать другой набор указателей вершин только для соответствия ожидаемому интерфейсу вершинного шейдера, часто проще скомпилировать/связать программу GLSL с макетом ваших данных вершин.

Такое поведение не так важно для униформ, но тем не менее они do имеют аналогичную функциональность в виде Uniform Buffers. Вы можете привязывать однородные буферы к доступному местоположению (по вашему выбору) и повторно использовать все значения в своем Едином блоке во всех ваших программах GLSL. Фактически, эта функциональность была первоначально введена в виде расширения с именем: GL_EXT_bindable_uniform