如何使用OpenGL ES 2在四边形中绘制纹理?

7

在OpenGL ES 2.0中,四边形(Quads)已不再支持,而在1.1版本中是可用的。使用OpenGL ES 2.0提供的可编程管线,我该如何简单地将一个纹理(最初为png文件)绘制到4个定义好的点上?

我需要使用VBO吗?我需要计算透视矩阵吗?所有这些事情对我来说都很麻烦...所使用的平台是iPhone。

3个回答

10

我找到了答案。即使是这么简单的任务,使用透视矩阵和着色器也是必须的。这个回答帮助我完成了它。

这里是我所用的代码,其中包括来自这本书es*()函数:

// 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

不要使用顶点为 1、2、3、4 的四边形,而是绘制两个顶点分别为 1、2、4 和 4、2、3 的三角形。


为什么不是1,2,3和3,4,1? - rmp251

1

谢谢,我知道这段代码,但它只是用来在帧缓冲区中绘制纹理并显示它,没有对其进行几何变换... - Stéphane Péchard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接