2011-08-01 11 views
9

dont dostać użycie glBindAttribLocation funkcji w OpenGL ES 2.0Zastosowanie funkcji glBindAttribLocation w OpenGL ES

Czy ktoś mi dać pełny kontekst? Czy w DirectX 10 jest to coś w rodzaju:

g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector(); 
Czytaj online w różnych witrynach, ale nie można uzyskać dostępu do tej funkcji. Potrzebna pomoc ..

+1

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ć? –

Odpowiedz

25

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.

+0

Jeśli nie używasz glBindAttribLocation, czy istnieje gwarantowane domyślne porządkowanie, takie jak 0,1,2 ... czy w tym przypadku wymagane jest wywołanie metody glGetAttribLocation? – Jochen

+0

@Jochen Jeśli nie używasz 'glBindAttribLocation' nic nie jest gwarantowane i potrzebujesz' glGetAttribLocation'. Podczas gdy rozsądny kierowca prawdopodobnie używałby pierwszych następujących po sobie wskaźników, nic nie powstrzymuje go przed używaniem dowolnych liczb. –

0

nigdy używane Direct X, ale glBindAttribLocation służy do określenia lokalizacji dla atrybutu w swoim cieniującego, że masz ten wiersz w swoim shadera:

attribute vec3 g_LightDir; 

Następnie można użyć glBindAttribLocation ustawić lokalizację dla tego vec3, musisz to zrobić po podłączeniu twojego vertex-shadera do programu cieniowania, ale zanim go połączysz (lub musisz "zsynchronizować" go). Jeśli nie określisz lokalizacji, kompilator zrobi to za ciebie i możesz zapytać o lokalizację za pomocą glGetAttribLocation.