2011-03-24 16 views
6

Quads no están incluidos en OpenGL ES 2.0 como en 1.1. Con el pipeline programable ofrecido por OpenGL ES 2.0, ¿cómo puedo simplemente dibujar una textura (originalmente un archivo png) en 4 puntos definidos?Cómo dibujar una textura en un quad con OpenGL ES 2?

¿Necesito una VBO? ¿Necesito calcular una matriz de perspectiva? Todas estas cosas son complicadas para mí ... La plataforma utilizada es el iPhone.

Respuesta

9

Encontré la respuesta. Es obligatorio utilizar una matriz de perspectiva y un sombreador, incluso para una tarea tan simple. This answer me ayudó a hacerlo.

Este es el código que usé, con funciones es*() de this book:

// generate an orthographic matrix 
esMatrixLoadIdentity(&projectionMatrix); 
esOrtho(&projectionMatrix, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
// generate a model view 
esMatrixLoadIdentity(&modelviewMatrix); 
// compute the final MVP 
esMatrixMultiply(&modelviewProjectionMatrix, &modelviewMatrix, &projectionMatrix); 
// setting up the viewport 
glViewport(0, 0, width, height); 
// binding 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 

glClearColor(0, 0, 0, 0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 
glActiveTexture(0); 
glBindTexture(GL_TEXTURE_2D, videoTexture); 

// setting up shader 
useProgram(projectionProgram); 

// updating uniform values 
GLint uMVPIndex  = indexUniform(projectionProgram, "mvpMatrix"); 
GLint uTextureIndex = indexUniform(projectionProgram, "textureImg"); 
glUniformMatrix4fv(uMVPIndex, 1, GL_FALSE, (GLfloat*) &modelviewProjectionMatrix.m[0][0]); 
glUniform1i(uTextureIndex, 0); 

// updating attribute values 
GLint aPositionIndex = indexAttribute(projectionProgram, "position"); 
GLint aTextureIndex = indexAttribute(projectionProgram, "inputTextureCoordinate"); 

// drawing quad 
static int strideVertex = 2*sizeof(GLfloat); // 2D position 
static int strideTexture = 2*sizeof(GLfloat); // 2D texture coordinates 

// beginning of arrays 
const GLvoid* vertices = (const GLvoid*) &screenVertices[0]; 
const GLvoid* textures = (const GLvoid*) &texCoordsFullScreen [0]; 

// enabling vertex arrays 
glVertexAttribPointer(aPositionIndex, 2, GL_FLOAT, GL_FALSE, strideVertex, vertices); 
glEnableVertexAttribArray(aPositionIndex); 
glVertexAttribPointer(aTextureIndex, 2, GL_FLOAT, GL_FALSE, strideTexture, textures); 
glEnableVertexAttribArray(aTextureIndex); 

// drawing 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// resetting matrices 
esMatrixLoadIdentity(&projectionMatrix); 
esMatrixLoadIdentity(&modelviewMatrix); 
esMatrixLoadIdentity(&modelviewProjectionMatrix); 
// resetting shader 
releaseProgram(projectionProgram); 
// unbinding texture 
glBindTexture(GL_TEXTURE_2D, 0); 
2

En lugar de quad con vértices 1, 2, 3, 4 Dibuje dos triángulos con los vértices 1, 2, 4 y 4, 2, 3, respectivamente.

+0

¿por qué no 1,2,3 y 3,4,1? – rmp251

Cuestiones relacionadas