如何在Java/Android Studio中使用OpenGL ES 2.0绘制2D纹理图片
问题排查与修复方案
1. 确认着色器编译、程序链接无错误
首次使用OpenGL着色器必须加状态校验逻辑,避免编译/链接失败导致代码不生效:
- 着色器编译完成后调用
GLES20.glGetShaderiv(shaderId, GLES20.GL_COMPILE_STATUS, status, 0)检查编译状态,若返回失败可通过GLES20.glGetShaderInfoLog(shaderId)获取错误详情 - 程序链接完成后调用
GLES20.glGetProgramiv(programId, GLES20.GL_LINK_STATUS, status, 0)检查链接状态
2. 补全纹理初始化参数
OpenGL ES 2.0默认纹理采样参数需要MIPMAP支持,若你没有生成MIPMAP、或使用了非2次幂尺寸的纹理,会直接导致纹理渲染失败。在纹理初始化绑定后添加如下参数配置:
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
3. 给color uniform赋值
你当前的片元着色器逻辑是纹理采样结果乘color变量,若没有给color赋值,默认值为全透明的(0,0,0,0),会导致纹理完全不可见。在draw方法中添加如下代码:
GLES20.glUniform4f(color_uniform, 1.0f, 1.0f, 1.0f, 1.0f);
4. 检查纹理坐标正确性
确认texture_buffer中存储的纹理坐标范围正确,常规矩形的四个顶点纹理坐标应为(0,0)、(1,0)、(1,1)、(0,1),和顶点坐标一一对应,避免坐标翻转或范围超出导致采样全黑/透明。
5. 补全顶点属性释放逻辑
你当前绘制完成后仅释放了position的顶点属性,没有释放纹理坐标属性,可能导致后续其他绘制逻辑异常,在draw方法末尾添加:
GLES20.glDisableVertexAttribArray(tex_position);
6. 校验纹理加载状态
确认纹理加载完成后texture.texture_id不为0,加载完成后可调用GLES20.glGetError()检查是否有纹理加载相关的报错。
内容的提问来源于stack exchange,提问作者user3684046
相关产品推荐
相关产品推荐

