下面是一个简单的使用OpenGL ES 2.0渲染纹理的示例代码:
首先,创建一个顶点着色器和一个片段着色器,分别用于定义顶点和像素处理。
顶点着色器代码(vertex_shader.glsl):
attribute vec4 position;
attribute vec2 texCoord;
varying vec2 v_texCoord;
void main() {
gl_Position = position;
v_texCoord = texCoord;
}
片段着色器代码(fragment_shader.glsl):
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D texture;
void main() {
gl_FragColor = texture2D(texture, v_texCoord);
}
然后,在你的渲染函数中,按照以下步骤执行:
- 创建和编译着色器程序。
GLuint programId = glCreateProgram();
// 创建并编译顶点着色器
GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderId, 1, &vertexShaderCode, NULL);
glCompileShader(vertexShaderId);
// 创建并编译片段着色器
GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderId, 1, &fragmentShaderCode, NULL);
glCompileShader(fragmentShaderId);
// 将两个着色器附加到程序中,并链接程序
glAttachShader(programId, vertexShaderId);
glAttachShader(programId, fragmentShaderId);
glLinkProgram(programId);
- 获取顶点位置和纹理坐标的属性位置。
GLint positionAttrLocation = glGetAttribLocation(programId, "position");
GLint texCoordAttrLocation = glGetAttribLocation(programId, "texCoord");
- 创建一个纹理对象并加载纹理图像数据。
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
// 设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 加载纹理图像数据到当前绑定的纹理对象中
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, imageData);
这里的 imageData
是你准备好的图像数据。
- 绑定顶点和纹理坐标缓冲区,并设置顶点属性指针。
// 创建和绑定顶点坐标缓冲区
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), verticesDataPointer,
GL_STATIC_DRAW);
// 启用顶点坐标属性数组
glEnableVertexAttribArray(positionAttrLocation);
glVertexAttribPointer(positionAttrLocation,
3,
GL_FLOAT,
false,
5 * sizeof(float),
(void*)0);
// 创建和绑定纹理坐标缓冲区
GLuint texCoordBuffer;
glGenBuffers(1,&texCoordBuffer);
glBindBuffer(GL_ARRAY_BUFFER,texCoordBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(texCoords),texCoordsDataPointer,GL_STATIC_DRAW);
// 启用纹理坐标属性数组
glEnableVertexAttribArray(texCoordAttrLocation);
glVertexAttribPointer(texCoordAttrLocation,
2,
GL_FLOAT,
false,
2 * sizeof(float),
(void*)0);
这里的 vertices
是顶点坐标数组,texCoords
是纹理坐标数组。
- 绘制图形并绑定纹理。
// 清除屏幕
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用着色器程序
glUseProgram(programId);
// 绑定纹理到纹理单元 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
// 设置纹理采样器统一变量的值为纹理单元索引 0
GLint textureUniformLocation = glGetUniformLocation(programId, "texture");
glUniform1i(textureUniformLocation, 0);
// 绘制图形(这里假设使用三角形带来绘制一个矩形)
glDrawArrays(GL_TRIANGLE_STRIP, 0, numVertices);
这里的 numVertices
是要绘制的顶点数量。
- 最后,记得在程序退出时删除创建的对象。
// 删除着色器和程序对象
glDetachShader(programId, vertexShaderId);
glDeleteShader(vertexShaderId);
glDetachShader(programId, fragmentShaderId);
glDeleteShader(fragmentShaderId);
glDeleteProgram(programId);
// 删除纹理对象
glDeleteTextures(1, &textureId);
// 删除顶点和纹理坐标缓冲区
glDeleteBuffers(1, &vertexBuffer);
glDeleteBuffers(1, &texCoordBuffer);
以上是一个简单的OpenGL ES 2.0渲染纹理的示例,你可以根据自己的需求进行扩展和修改。希望对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问