按照前文梳理的Android OpenGL贴图流程,Android JAVA代码实现如下:
(1)生成纹理对象
final int[] texNames = {0};
glGenTextures(1, texNames, 0);
glBindTexture(GL_TEXTURE_2D, texNames[0]);
(2)设置过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//对纹理坐标进行截取,所有大于1.0的值都设置为1.0,所有小于0.0的值都设置为0.0
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
(3)定义着色器—确定像素颜色和位置
1.定义顶点和片段着色器
private static final String VERTEX_SHADER_CODE =
"attribute vec4 position;" +
"attribute vec4 inputTextureCoordinate;" +
"varying vec2 textureCoordinate;" +
"void main()" +
"{" +
" gl_Position = position;" +
" textureCoordinate = vec2(inputTextureCoordinate.s, inputTextureCoordinate.t);" +
"}";
private static final String FRAGMENT_SHADER_CODE =
"varying mediump vec2 textureCoordinate;" +
"uniform sampler2D textureSampler;" +
"void main() { " +
" gl_FragColor = texture2D(textureSampler, textureCoordinate);" +
"}";
2.加载着色器并启用顶点和纹理坐标
final int vertexShader = loadShader(GL_VERTEX_SHADER, VERTEX_SHADER_CODE);
final int pixelShader = loadShader(GL_FRAGMENT_SHADER, FRAGMENT_SHADER_CODE);
final int program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, pixelShader);
glLinkProgram(program);
glDeleteShader(pixelShader);
glDeleteShader(vertexShader);
final int positionLocation = glGetAttribLocation(program, "position");
final int textureSampler = glGetUniformLocation(program, "textureSampler");
final int coordinateLocation = glGetAttribLocation(program, "inputTextureCoordinate");
glUseProgram(program);
Buffer textureBuffer = createFloatBuffer(TEXTURE);
Buffer verticesBuffer = createFloatBuffer(VERTICES);
glVertexAttribPointer(coordinateLocation, 2, GL_FLOAT, false, 0, textureBuffer);
glEnableVertexAttribArray(coordinateLocation);
glUniform1i(textureSampler, 0);
glVertexAttribPointer(positionLocation, 2, GL_FLOAT, false, 0, verticesBuffer);
glEnableVertexAttribArray(positionLocation);
(4)指定纹理
InputStream in = null;
try {
in = getContext().getAssets().open("guide_image_4.png");
} catch (Exception e) {
}
final Bitmap bitmap = BitmapFactory.decodeStream(in);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap, 0);
(5)绘制
//绘制白色背景
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//启用背景混合模式
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);
如果不需要设置颜色背景,一行代码glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)就可以了。