Ta funkcja pozwala określić indeks atrybutów dla zdefiniowanego przez użytkownika atrybutu modułu cieniującego (nie dla jednolitego, jak sugeruje twój przykładowy kod), który później wykorzystasz przy odwoływaniu się do atrybutu.
Say masz vertex shader:
...
attribute vec4 vertex; //or 'in vec4 vertex' in modern syntax
attribute vec3 normal;
...
wtedy może wiązać indeksy do tych zmiennych, z
glBindAttribLocation(program, 0, "vertex");
glBindAttribLocation(program, 1, "normal");
Można użyć cokolwiek nieujemne liczby lubisz (w niewielkim zakresie). Następnie, odnosząc się do tych atrybutów, używa się ich indeksów, np. w funkcjach glVertexAttribPointer
lub glEnableVertexAttribArray
.
Należy jednak pamiętać, że przed połączeniem z programem należy wywołać glBindAttribLocation
. Możesz go również pominąć. Następnie OpenGL automatycznie wiąże indeksy do wszystkich używanych atrybutów podczas łączenia, które mogą później zostać sprawdzone przez glGetAttribLocation
. Ale dzięki glBindAttribLocation
możesz ustalić własną semantykę indeksu atrybutów i zachować spójność.
Nowsze wersje GLSL nawet pozwalają określić indeksy atrybutów wewnątrz shadera (z użyciem składni layout
), co eliminuje konieczność dla każdej glBindAttribLocation
lub glGetAttribLocation
, ale nie jestem pewien, czy to jest obsługiwana w ES.
Ale moja odpowiedź nie mówi nic więcej niż te "różne" strony, które przeglądałeś lub jakąś dobrą książkę OpenGL/GLSL, więc jeśli nadal nie rozumiesz, zagłęb się trochę w podstawy GLSL.
Czy wymyśliłeś to sam i zapomniałeś o swoim pytaniu, czy nadal masz jakieś wątpliwości, które możesz chcieć zadać? –