OpenGL进阶之关于生成纹理ID

  • 载入纹理的步骤:

    • GLES20.glGenTextures() : 生成纹理资源的句柄

    • GLES20.glBindTexture(): 绑定句柄

    • GLUtils.texImage2D() :将bitmap传递到已经绑定的纹理中

    • GLES20.glTexParameteri() :设置纹理属性,过滤方式,拉伸方式等

  • 纹理的数据来源

    • 将Bitmap以纹理的形式载入OpenGL中:

      /**
       * @param textureTarget Texture类型。
       *                      1. 相机用 GLES11Ext.GL_TEXTURE_EXTERNAL_OES
       *                      2. 图片用GLES20.GL_TEXTURE_2D
       * @param minFilter     缩小过滤类型 (1.GL_NEAREST ; 2.GL_LINEAR)
       * @param magFilter     放大过滤类型
       * @param wrapS         X方向边缘环绕
       * @param wrapT         Y方向边缘环绕
       * @return 返回创建的 Texture ID
       */
      public static int createTexture(int textureTarget, @Nullable Bitmap bitmap, int minFilter,
                                      int magFilter, int wrapS, int wrapT) {
          int[] textureHandle = new int[1];
      
          GLES20.glGenTextures(1, textureHandle, 0);
          checkGlError("glGenTextures");
          GLES20.glBindTexture(textureTarget, textureHandle[0]);
          checkGlError("glBindTexture " + textureHandle[0]);
          GLES20.glTexParameterf(textureTarget, GLES20.GL_TEXTURE_MIN_FILTER, minFilter);
          GLES20.glTexParameterf(textureTarget, GLES20.GL_TEXTURE_MAG_FILTER, magFilter); //线性插值
          GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_WRAP_S, wrapS);
          GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_WRAP_T, wrapT);
      
          if (bitmap != null) {
              GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
          }
      
          checkGlError("glTexParameter");
          return textureHandle[0];
      }
      
    • 将 RGB 以纹理的形式载入OpenGL中:

      /***
      * 将 RGB 数据 转化 成纹理 ID
      * @param videoW 纹理宽
      * @param videoH 纹理高
      * @param rgbData 视频桢的 RGB 数据
      * @param textureId 因为视频根据帧率刷新,频繁调用onDrawFrame,
      *                     所以不适合多次创建纹理资源ID,
      *                     所以最好在onCreate创建好,免得OOM
      * @return 绑定好 RGB 数据的纹理 ID
      */
      public static int generateRGBTexture(int videoW, int videoH, byte[] rgbData, int textureId) {
            if (rgbData == null) {
                return -1;
            }
      
            ByteBuffer colorByteBuffer = null;
      
            if (colorByteBuffer == null) {
                colorByteBuffer = ByteBuffer.allocate(videoW * videoH * 4);
            }
      
            //生成纹理ID
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
            if (colorByteBuffer != null) {
                colorByteBuffer.clear();
                colorByteBuffer.put(rgbData, 0, videoW * videoH * 4);
            } else {
                return -1;
            }
      
            colorByteBuffer.position(0);
            GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0,
                      GLES20.GL_RGBA, videoW, videoH, 0,
                      GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, colorByteBuffer);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
      
            return textureId;
      }
      

你可能感兴趣的:(OpenGL进阶之关于生成纹理ID)