2011-09-17 7 views
6

ho scremato attraverso il forum specifiche e OpenGL, ma non riuscivo a dare un senso a questo:* BaseVertex e gl_VertexID

sono la versione *BaseVertex dei comandi di disegno supposti per aggiungere alla variabile GLSL gl_VertexID? Mentre funziona, gl_VertexID contiene l'indice preso dallo ELEMENT_ARRAY_BUFFER associato prima che sia aggiunto basevertex.

Quindi, la mia domanda è: È questo il comportamento corretto? Suppongo che gl_VertexID debba contenere l'indice utilizzato per recuperare il vertice.

risposta

4

Sì, questo è il bahviour corretto. Lo scenario di utilizzo di BaseVertex è che devi cambiare solo questo valore, invece di regolare gli offset del buffer negli array dei vertici con le funzioni gl*Pointer.

L'idea è, che è possibile caricare i dati da più mesh (file di modello) in un singolo VBO, senza la necessità di regolare gli indici.

+0

Sì, ha senso. Immagino che qualcosa come "gl_Element'" - che conterrebbe l'indice finale calcolato - sarebbe un buon complemento a 'gl_VertexID' in qualche versione futura di OpenGL/GLSL. Grazie. – palle8x

+0

@ palle8x Non credo, perché l'indice dall'array di elementi è più importante, concettualmente. E puoi semplicemente aggiungere un'uniforme per la baseVertex e aggiungerla a 'gl_VertexID', se davvero ne hai bisogno. –

+0

Sono d'accordo, e quello che descrivi è ciò che faccio attualmente nel mio codice. Ma penso ancora che ci sia un caso d'uso valido per qualcosa come "' gl_Element' ", e (credo) non sarebbe troppo difficile da implementare nel driver. – palle8x

0

La tua ipotesi è giusta. gl_VertexID dovrebbe includere offset BaseVertex.

opengl wiki about GLSL built-in vars:

Nota: gl_VertexID avrà il vertice di base applicato ad esso.

about glDrawElementsBaseVertex:

La gl_VertexID passato al Vertex Shader sarà l'indice dopo essere compensato da basevertex, non indice prelevato dal buffer.

Sfortunatamente, alcuni vecchi driver non l'hanno implementato correttamente.