2011-12-18 5 views
5

En el 2.0 introducción OpenGL ES, encontrado aquí: http://www.webreference.com/programming/opengl_es/2.html un shader de vértice se define:OpenGL ES posición 2,0 precisaraÂn atributo vec3 o vec4

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

El atributo vPosition es un vector de cuatro componentes.

Más adelante en el texto, la aplicación compilará el sombreador de vértices, junto con el sombreador de fragmentos. Con la glBindAttribLocation un mango para pasar los datos de aplicaciones de vértice para que se establezca la shader:

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

Los 2 shaders ahora están vinculados y el programa está listo para usar.

El caso de uso es el siguiente:

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); 

Lo que significa que:

  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices): pasar los datos de vértice para el programa, el uso de ubicación 0, cada vértice tiene 3 componentes, el tipo es flotante, no se usará normalización.

  • glEnableVertexAttribArray(0): El sombreador utilizará los datos pasados.

  • glDrawArrays(GL_TRIANGLES, 0, 3);: El sombreador ejecutará el código para dibujar un solo triángulo, utilizando el primero (y único) de los tres vértices que se encuentran en la matriz especificada.

Mis preguntas son:

  • El shader de vértice está a la espera de una posición de cuatro vértice componente (x, y, z, w), el programa pasa sólo tres componentes (x, y, z) datos ¿Por qué está funcionando?

  • El sombreador necesita un vec4, el componente w debe ser 1 para funcionar como se espera. ¿Qué paso es responsable de agregar correctamente el componente w?

Respuesta

16

Ver esta respuesta: Can you use glVertexAttribPointer to assign a smaller vector to a larger one?

Como se mencionó en ese puesto y como aparece en los GLE especificaciones: http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.24.pdf
En la sección 2.8 de este documento se dice:

Cuando un elemento de matriz i se transfiere al GL mediante los comandos DrawArrays o DrawElements, cada atributo genérico se expande a cuatro componentes . Si el tamaño es uno, el componente x del atributo es especificado por la matriz; los componentes y, z y w se establecen implícitamente en cero, cero y uno, respectivamente. Si el tamaño es dos, la matriz especifica los componentes x e y del atributo; los componentes z y w se establecen implícitamente en cero y uno, respectivamente.Si el tamaño es tres, se especifican x, y y z, y w se establece implícitamente en uno. Si el tamaño es cuatro, se especifican todos los componentes.

+0

Hola Jave - gracias por la respuesta y el enlace. Las cosas se vuelven más claras. – Gisela

+1

@Gisela Si la respuesta resolvió su problema, entonces [aceptar] (http://stackoverflow.com/faq#howtoask) es la respuesta correcta. –

+0

@christian: hecho – Gisela

Cuestiones relacionadas