美文网首页
GLES2.0 纹理 第四课

GLES2.0 纹理 第四课

作者: XX杰 | 来源:发表于2023-01-21 19:42 被阅读0次

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

还是要同样记住一点 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

相关文章

  • 2018-02-07-OpenGL详细步骤

    1.在Activity中创建GLSurfaceView 判断设备是否支持GLES2.0 支持的话,设置EGL版...

  • 八、OpenGL - 纹理金字塔

    一 初始化数据 生成纹理对象 绑定纹理 读取纹理文件 设置纹理参数 载入纹理 创建金字塔并设置纹理顶点映射 二 渲...

  • 六.OpenGL纹理

    纹理API 纹理过滤方式: 纹理环绕⽅式:

  • 004-GLKit加载图片

    使用GLKit加载图片 GLKTextureInfo 加载纹理, 封装了申请纹理, 绑定纹理, copy纹理数据到...

  • 纹理压缩简介 DXT PVR ETC

    参考为什么需要纹理压缩移动端纹理压缩格式干货:Unity游戏开发图片纹理压缩方案Creator使用压缩纹理常用纹理...

  • 03源码--005--纹理应用:金字塔贴图

    [TOC] SetupRC:准备纹理数据【重点】 分配纹理、绑定纹理 纹理变量:一般使用无符号整型。GLuint ...

  • 【Unity Shader入门精要学习】基础纹理(一)

    单张纹理 注意shader中纹理坐标的变换: 1、纹理属性 wrap modewrap mode它决定了当纹理坐标...

  • OpenGL纹理常用API解析

    纹理对象 读取.TGA文件的纹理 设置纹理参数 设置环绕方式 设置过滤方式 载入纹理 环绕方式

  • OpenGL-纹理应用

    纹理坐标 加载纹理只是在几何图形上应用纹理的第一步。最低限度我们必须同时提供纹理坐标,并设置纹理坐标环绕模式和纹理...

  • 10.OpenGL 纹理知识与API学习记录

    一、什么是纹理 纹理,英文是texture,中文可以翻译成纹理、纹理图、纹理映射等等一堆东西。不过不管翻译成啥,讲...

网友评论

      本文标题:GLES2.0 纹理 第四课

      本文链接:https://www.haomeiwen.com/subject/uakqhdtx.html