目錄
一、獲取圖片紋理數據
二、著色器編寫
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