【问题标题】:Opengl ES 2.0 : Get texture size and other infoOpengl ES 2.0:获取纹理大小和其他信息
【发布时间】:2015-05-09 12:55:25
【问题描述】:

问题的上下文是 Android 环境中的 OpenGL ES 2.0。我有质感。显示或使用它没有问题。

有没有一种方法可以简单地从它的绑定 id 开始知道它的宽度和高度以及其他信息(如内部格式)?

我需要在不知道纹理大小的情况下将纹理保存到位图。

【问题讨论】:

    标签: java android opengl-es opengl-es-2.0


    【解决方案1】:

    在 ES 2.0 中没有。功能不存在实际上有点令人惊讶。可以获取渲染缓冲区的大小,但不能获取纹理的大小,这似乎不一致。

    唯一可用的是您可以使用glGetTexParameteriv() 获得的值,即纹理的FILTERWRAP 参数。

    它仍然不在 ES 3.0 中。仅在 ES 3.1 中,添加了 glGetTexLevelParameteriv(),它使您可以访问您正在寻找的所有值。例如获取当前绑定纹理的宽高:

    int[] texDims = new int[2];
    GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, texDims, 0);
    GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, texDims, 1);
    

    【讨论】:

      【解决方案2】:

      正如@Reto Koradi 所说,没有办法做到这一点,但是您可以在从 android 上下文加载纹理时存储纹理的宽度和高度,然后再将其绑定到 OpenGL 中。

          AssetManager am = context.getAssets();
          InputStream is = null;
          try {
              is = am.open(name);
          } catch (IOException e) {
              e.printStackTrace();
          }
          final Bitmap bitmap = BitmapFactory.decodeStream(is);
          int width = bitmap.getWidth();
          int height = bitmap.getHeight();
      
          // here is you bind your texture in openGL
      

      【讨论】:

        【解决方案3】:

        我会建议一个 hack 来做这件事。使用 ESSL 的 textureSize 函数。要从 CPU 端访问它的结果,您必须将纹理作为制服传递给着色器,并将纹理大小作为着色器输出的 r & g 组件输出。将此着色器应用于绘制到 1x1px FBO 的 1x1px 图元,然后使用 glReadPixels 从 GPU 回读绘制的值。

        您必须小心舍入、钳位和 FBO 格式。您可能需要 16 位整数 FBO 格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-19
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2012-03-29
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多