天天看点

Android OpenGL 纹理绘制图像---JAVA实现

按照前文梳理的Android OpenGL贴图流程,Android JAVA代码实现如下:

(1)生成纹理对象

final int[] texNames = {};
 glGenTextures(, texNames, );
 glBindTexture(GL_TEXTURE_2D, texNames[]);
           

(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, , GL_FLOAT, false, , textureBuffer);
 glEnableVertexAttribArray(coordinateLocation);
 glUniform1i(textureSampler, );
 glVertexAttribPointer(positionLocation, , GL_FLOAT, false, , 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, , GLES20.GL_RGBA, bitmap, );
           

(5)绘制

//绘制白色背景
 glClearColor(f, f, f, f);

 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, , );

 glDisable(GL_BLEND);
           

如果不需要设置颜色背景,一行代码glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)就可以了。

附上github地址:https://github.com/qiaoyanfei/OpenGL_Image.git