2011-12-18 10 views
5

Nella 2.0 introduzione OpenGL ES, trovato qui: http://www.webreference.com/programming/opengl_es/2.html un vertex è definito:OpenGL ES 2.0 posizione specifiying attributo vec3 o vec4

GLbyte vShaderStr[] = 
    "attribute vec4 vPosition; \n" 
    "void main()     \n" 
    "{       \n" 
    " gl_Position = vPosition; \n" 
    "};       \n"; 

L'attributo vPosition è un componente di vettore quattro.

Più avanti nel testo l'applicazione compilerà il vertex shader, insieme allo shader di frammenti. Con il glBindAttribLocation una maniglia per passare i dati applicazioni vertex è stabilito lo Shader:

// Bind vPosition to attribute 0 
glBindAttribLocation(programObject, 0, "vPosition"); 

I 2 shader sono ora collegati e il programma è pronto per l'uso.

Il caso d'uso è questo:

GLfloat vVertices[] = {0.0f, 0.5f, 0.0f, 
         -0.5f, -0.5f, 0.0f, 
         0.5f, -0.5f, 0.0f}; 
... 
// Load the vertex data 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); 
glEnableVertexAttribArray(0); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

che significa:

  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices): passare i dati di vertice al programma, uso posizione 0, ogni vertice ha 3 componenti, tipo è fluttuare, non si deve usare la normalizzazione.

  • glEnableVertexAttribArray(0): Lo shader utilizzerà i dati passati.

  • glDrawArrays(GL_TRIANGLES, 0, 3);: Lo shader eseguirà il codice per disegnare un singolo triangolo, utilizzando i primi (e solo) tre vertici trovati nell'array specificato.

mie domande sono:

  • Il vertex si aspetta una posizione quattro componente vertice (x, y, z, w), il programma passa solo tre componenti (x, y, z) dati Perché funziona?

  • Lo shader ha bisogno di un vec4, il componente w deve essere 1 per funzionare come previsto. Quale fase è responsabile per l'aggiunta del componente w in modo corretto?

risposta

16

Vedere questa risposta: Can you use glVertexAttribPointer to assign a smaller vector to a larger one?

Come accennato in questo post appare nelle specifiche Gles: http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.24.pdf
Nella sezione 2.8 del presente documento si legge:

Quando un elemento di un array I viene trasferito al GL dai DrawArray o dai comandi DrawElements, ciascun attributo generico viene esteso a quattro componenti . Se la dimensione è una, il componente x dell'attributo è specificato dalla matrice; i componenti y, z e w sono implicitamente impostati su su zero, zero e uno, rispettivamente. Se la dimensione è due, i componenti xey dell'attributo vengono specificati dall'array; i componenti z e w sono implicitamente impostati su zero e uno, rispettivamente.Se la dimensione è tre, vengono specificati x, yez e w è implicitamente impostato su . Se la dimensione è quattro, vengono specificati tutti i componenti.

+0

Ciao Jave - grazie per la risposta e il collegamento. Le cose stanno diventando più chiare. – Gisela

+1

@Gisela Se la risposta ha risolto il problema, [accettare] (http://stackoverflow.com/faq#howtoask) è la risposta corretta. –

+0

@christian: fatto – Gisela