目录
一、获取图片纹理数据
二、着色器编写
1. 顶点着色器
2. 片元着色器
三、绑定和绘制纹理
1. 绑定纹理
2. 绘制纹理
四、源码下载
一、获取图片纹理数据
获取图片纹理数据代码如下:
//获取图片1纹理数据
mTextureId = loadTexture(mContext, R.mipmap.scenery)
//获取图片2纹理数据
mTextureMeiNvId = loadTexture(mContext, R.mipmap.meinv)fun loadTexture(context: Context, resourceId: Int): Int {var bitmap = generateBitmap(context, resourceId)if (bitmap == null) {Log.d(TAG, "resourceId could not be decoded.")return 0}return getImgTexture(bitmap)
}fun getImgTexture(bitmap: Bitmap): Int {val textureObjectIds = IntArray(1)glGenTextures(1, textureObjectIds, 0)if (textureObjectIds[0] == 0) {glDeleteTextures(1, textureObjectIds, 0)return 0}glBindTexture(GL_TEXTURE_2D, textureObjectIds[0])glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)texImage2D(GL_TEXTURE_2D, 0, bitmap, 0)glGenerateMipmap(GL_TEXTURE_2D)bitmap.recycle()glBindTexture(GL_TEXTURE_2D, 0)return textureObjectIds[0]
}
二、着色器编写
1. 顶点着色器
代码如下:
attribute vec4 a_Position; // 顶点坐标
attribute vec2 a_TextureCoordinates; //纹理坐标
varying vec2 aCoord;void main(){gl_Position = a_Position;aCoord = a_TextureCoordinates;
}
2. 片元着色器
代码如下:
precision mediump float;// 数据精度varying vec2 aCoord;
uniform sampler2D u_TextureUnit;
uniform sampler2D u_TextureUnit1;void main(){gl_FragColor = mix(texture2D(u_TextureUnit, aCoord), texture2D(u_TextureUnit1, aCoord), 0.5);
}
三、绑定和绘制纹理
1. 绑定纹理
GLES20.glActiveTexture(GL_TEXTURE0)GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId)mTextureShaderProgram!!.setUniforms(mTextureShaderProgram!!.getTextureUniformLocation(),0)GLES20.glActiveTexture(GL_TEXTURE1)GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureMeiNvId)mTextureShaderProgram!!.setUniforms(mTextureShaderProgram!!.getTextureUniform1Location(),1)
2. 绘制纹理
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 6)
图一:
图二:
叠加后的效果图如下:
四、源码下载
Android OpenGL ES多个纹理实现混叠显示项目源码
下载地址:
https://download.csdn.net/download/github_27263697/90115686
推荐文章
https://juejin.cn/post/7155040552353234951