ZBLOG

opengl es2.0渲染纹理示例

下面是一个简单的使用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);
}

然后,在你的渲染函数中,按照以下步骤执行:

  1. 创建和编译着色器程序。
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);
  1. 获取顶点位置和纹理坐标的属性位置。
GLint positionAttrLocation = glGetAttribLocation(programId, "position");
GLint texCoordAttrLocation = glGetAttribLocation(programId, "texCoord");
  1. 创建一个纹理对象并加载纹理图像数据。
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 是你准备好的图像数据。

  1. 绑定顶点和纹理坐标缓冲区,并设置顶点属性指针。
// 创建和绑定顶点坐标缓冲区
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 是纹理坐标数组。

  1. 绘制图形并绑定纹理。
// 清除屏幕
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 是要绘制的顶点数量。

  1. 最后,记得在程序退出时删除创建的对象。
// 删除着色器和程序对象
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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=2648

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?