GLES2.0 纹理 第四课

2023-01-21  本文已影响0人  XX杰

第三课讲了 绘制。这里 理解一下纹理
纹理:可以简单理解成图片数据

还是要同样记住一点 OpenGL 中使用的是 native 方法,所以,纹理也是用 int/long 来表示的

构建一个纹理

// 1、创建一个纹理
      int texObjIds[] = new int[1];
      GLES20.glGenTextures(1, texObjIds, 0);

      if (texObjIds[0] == 0) {
         System.out.println("majie 纹理创建失败...");
         return 0;
      }
// 2、 声明 下面的左右操作,都是针对 这个 纹理 的
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texObjIds[0]);

      // 3、 设置纹理 放大 和 缩小采用的 过滤方式
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

      //设置环绕方式
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

      // 4、加载bitmap到纹理中
      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

// 5、因为 采用 了 GL_LINEAR_MIPMAP_LINEAR  的缩小方式,这种方式需要使用 MIP 贴图,
      // 所以我们需要针对 当前的纹理,让 openGL 自动生成对应的 MIP 贴图
      GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

      // 最后 纹理解绑 ,防止后面的代码也是针对 这个纹理进行操作的
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

1、glBindTexture 说明 将要使用纹理
2、设置纹理的属性,之后 texImage2D 这个方法就是将图片加载到纹理上
3、glBindTexture 纹理用完,在将其设置为 0

同样的也需要 第三课讲解的 着色器的加载。但是纹理的属性是 二维的 "attribute vec2 a_TextureCoordinates;\n 是这样声明定义的
private static final String vertex_shader = "uniform mat4 u_Matrix;\n" + // 横竖屏切换的时候的矩阵变换
           "attribute vec4 a_Potision;\n" + // 顶点的位置属性
           "attribute vec2 a_TextureCoordinates;\n" +    // 顶点的 纹理 属性 的 坐标位置
           "varying vec2 v_TextureCoordinates;\n" +      // 纹理属性的 渐变 属性 的 坐标位置
           "void main() {\n" +
           "    v_TextureCoordinates = a_TextureCoordinates;\n" +  // 纹理属性 赋值给 该顶点的渐变 属性
           "    gl_Position = u_Matrix * a_Potision;\n" +
           "}";

   private static final String fragment_shader = "precision mediump float;\n" +
           "uniform sampler2D u_textureUnit; \n" +    // 实际的纹理数据
           "varying vec2 v_TextureCoordinates;\n" +   // 渐变属性的坐标位置
           "void main() {\n" +
           // 着色器 函数, 把 纹理数据 和 坐标 关联
           "    gl_FragColor=texture2D(u_textureUnit, v_TextureCoordinates);\n" +
           "}";

其中片元着色器的 code 中,定义了 sampler2D 的类 和 使用了 texture2D的方法

纹理在 onDrawFrame 方法中 绘制也是使用的不同的

glActiveTexture(GL_TEXTURE0);
// 这个需要在 onDrawFrame 方法中 调用 一下,才可以显示出 图片来
glBindTexture(GL_TEXTURE_2D, textureId);
上面的两个方法就是激活纹理,绑定纹理
GLES20.glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
绘制纹理到那些顶点上
glBindTexture(GL_TEXTURE_2D, 0);// 纹理解除绑定

纹理也是有对应的纹理坐标的,纹理坐标是 xy 是vec2

上一篇 下一篇

猜你喜欢

热点阅读