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

按照前文梳理的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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值