Использование функции glBindAttribLocation в OpenGL ES - PullRequest
9 голосов
/ 01 августа 2011

Я не могу использовать функцию glBindAttribLocation в OpenGL ES 2.0

Может кто-нибудь дать мне полный контекст? Это что-то вроде

g_pLightDir = g_pEffect10->GetVariableByName( "g_LightDir" )->AsVector();

в DirectX 10? Читайте онлайн на разных сайтах, но не можете воспользоваться этой функцией. Нужна помощь ..

Ответы [ 2 ]

25 голосов
/ 01 августа 2011

Эта функция позволяет вам указать индекс атрибута для определенного пользователем атрибута шейдера (не для униформы, как предлагает ваш пример кода), который вы позже будете использовать при обращении к атрибуту.

Скажем, у вас есть вершинный шейдер:

...
attribute vec4 vertex;     //or 'in vec4 vertex' in modern syntax
attribute vec3 normal;
...

Затем вы можете привязать индексы к этим переменным с помощью

glBindAttribLocation(program, 0, "vertex");
glBindAttribLocation(program, 1, "normal");

Вы можете использовать любые неотрицательные числа, которые вам нравятся (в небольшом диапазоне). Затем при обращении к этим атрибутам вы используете их индексы, например, в glVertexAttribPointer или glEnableVertexAttribArray функциях.

Но имейте в виду, что glBindAttribLocation должен быть вызван перед подключением программы. Вы также можете опустить это. Затем OpenGL автоматически связывает индексы со всеми используемыми атрибутами во время связывания, что позже может быть запрошено с помощью glGetAttribLocation. Но с помощью glBindAttribLocation вы можете установить собственную семантику индекса атрибута и поддерживать их согласованными.

Более новые версии GLSL даже позволяют указывать индексы атрибутов в шейдере (используя синтаксис layout), устраняя необходимость в glBindAttribLocation или glGetAttribLocation, но я не уверен, поддерживается ли это в ES.

Но мой ответ не говорит вам больше, чем те "различные" сайты, на которые вы смотрели, или какая-либо хорошая книга OpenGL / GLSL, так что если вы все еще не получаете ее, углубитесь в основы GLSL.

0 голосов
/ 01 августа 2011

Я никогда не использовал Direct X, но glBindAttribLocation используется для определения местоположения атрибута в вашем шейдере, скажем, у вас есть этот ряд в вашем шейдере:

attribute vec3 g_LightDir;

Затем вы можете использовать glBindAttribLocation, чтобы установить местоположение для этого vec3, вы должны сделать это после того, как вы подключили ваш вершинный шейдер к вашей шейдерной программе, но перед тем, как связать его (или вам придется «связать» его). Если вы не укажете местоположение, компилятор сделает это за вас, и вы можете запросить местоположение с помощью glGetAttribLocation.

...