2011-09-22 9 views
7

Devo inviare gli attributi del vertice usando glVertexAttribPointer agli shader che li prevedono come built-in (gl_Vertex, gl_Color, ecc.).glVertexAttribPointer sugli attributi dei vertici incorporati come gl_Vertex, gl_Normal

La funzione glVertexAttribPointer deve specificare l'indice (o la posizione) di ciascun attributo incorporato. Posso farlo sulle implementazioni NVidia poiché la posizione di ciascun attributo è fissa (vedere http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php nella sezione "Attributi personalizzati), tuttavia non sono sicuro delle posizioni nell'implementazione ATI.

Inoltre, la funzione glGetAttribLocation restituirà -1 quando si cerca di ottenere la posizione di qualsiasi attributo che inizia inizia con "gl_".

Penso che mi manca qualcosa e questo è un problema banale, ma non ho trovato la soluzione corretta per ATI.

+0

Benvenuti in SO, spero che abbiate letto le [FAQ] (http://stackoverflow.com/faq). –

risposta

7

Gli array di attributi incorporati non sono impostati con glVertexAttribPointer, ma con funzioni come glVertexPointer, glColorPointer, .... E abilitate questi chiamando glEnableClientState con costanti come GL_VERTEX_ARRAY, GL_COLOR_ARRAY, ..., anziché glEnableVertexAttribArray.

Considerando che su nVidia glVertexAttribPointer potrebbe funzionare, a causa del loro aliasing degli indici di attributi personalizzati con gli attributi incorporati, questo non è conforme allo standard e sono sicuro che non ci si può aspettare da nessun altro fornitore di hardware. Pertanto, per essere sicuri, utilizzare glVertexAttribPointer per gli attributi personalizzati e le funzioni glVertexPointer/glNormalPointer/... per gli attributi bultin, insieme alle funzioni di abilitazione/disabilitazione corrispondenti.

Ricordare che gli attributi incorporati sono tuttavia deprecati insieme alle funzioni menzionate. Quindi se vuoi scrivere un codice OpenGL moderno, dovresti comunque definire i tuoi attributi. Ma forse devi supportare gli ombreggiatori legacy o non ti importa della compatibilità in avanti al momento.

+0

Grande! Questo è quello che sospettavo. Tuttavia, ho provato a farlo funzionare usando glVertexAttribPointer poiché le chiamate gl * Pointer sono deprecate nelle versioni più recenti di OpenGL. Grazie!!! –

+4

@Pau Gli attributi bultin sono comunque deprecati, quindi se li usi, usi già funzionalità deprecate. E se la risposta fosse d'aiuto, l'accettazione sarebbe apprezzata. –

+0

Grazie Christian, la tua risposta è stata davvero molto utile. Era la mia prima domanda su StackOverflow. –

Problemi correlati