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