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

来源:互联网 发布:js函数参数为对象 编辑:程序博客网 时间:2024/04/19 12:51

按照前文梳理的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)就可以了。

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

0 0
原创粉丝点击