2011-09-22 8 views
7

Muszę wysyłać atrybuty wierzchołków za pomocą glVertexAttribPointer do shaderów, oczekując ich jako wbudowanych (gl_Vertex, gl_Color itd.).glVertexAttribPointer na wbudowanych atrybutach wierzchołków, takich jak gl_Vertex, gl_Normal

Funkcja glVertexAttribPointer musi określić indeks (lub lokalizację) każdego wbudowanego atrybutu. Mogę to zrobić w implementacjach NVidia, ponieważ lokalizacja każdego atrybutu jest stała (zobacz http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php w sekcji "Niestandardowe atrybuty", ale nie jestem pewien co do lokalizacji w implementacji ATI.

Również funkcja glGetAttribLocation powróci -1 gdy próbuje dostać lokalizację dowolnego atrybutu rozpoczynające zaczynające się od „gl_”.

Chyba czegoś brakuje i to niemały problem, jednak ja nie znalazłem właściwe rozwiązanie dla ATI.

+0

Witaj w SO, mam nadzieję, że przeczytałeś [FAQ] (http://stackoverflow.com/faq). –

Odpowiedz

7

Wbudowane tablice atrybutów nie są ustawione za pomocą glVertexAttribPointer, ale z funkcjami takimi jak glVertexPointer, glColorPointer, .... Włącz je, dzwoniąc pod numer glEnableClientState ze stałymi takimi jak GL_VERTEX_ARRAY, GL_COLOR_ARRAY, ..., zamiast z glEnableVertexAttribArray.

Podczas gdy na nVidii może działać, ze względu na aliasing niestandardowych indeksów atrybutów z wbudowanymi atrybutami, nie jest to standard zgodny i jestem pewien, że nie można tego oczekiwać u żadnego innego dostawcy sprzętu. Dlatego upewnij się, że korzystasz z glVertexAttribPointer dla atrybutów niestandardowych i funkcji glVertexPointer/glNormalPointer/... dla atrybutów bultin wraz z pasującymi funkcjami włączania/wyłączania.

Należy pamiętać, że wbudowane atrybuty są i tak przestarzałe, wraz z wymienionymi funkcjami. Jeśli więc chcesz napisać nowoczesny kod OpenGL, i tak powinieneś zdefiniować własne atrybuty. Ale być może trzeba wspierać starsze moduły cieniujące lub nie dbać o kompatybilność w tej chwili.

+0

Świetnie! Właśnie to podejrzewałem. Jednak starałem się, aby działało, używając glVertexAttribPointer, ponieważ wywołania gl * Pointer są przestarzałe w nowszych wersjach OpenGL. Dzięki!!! –

+4

@Pau Atrybuty bultin i tak są przestarzałe, więc jeśli używasz tych atrybutów, już używasz przestarzałej funkcjonalności. A jeśli odpowiedź pomogłaby, zaakceptowanie byłoby docenione. –

+0

Dzięki Christian, twoja odpowiedź była bardzo pomocna. To było moje pierwsze pytanie na temat stackoverflow. –