Opengl ES 2.0:获取纹理大小和其他信息

时间:2015-05-09 12:55:26

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

问题的背景是Android环境中的OpenGL ES 2.0。我有一个纹理。没有问题显示或使用它。

是否有一种方法可以从其绑定ID开始知道其宽度和高度以及其他信息(如内部格式)?

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

3 个答案:

答案 0 :(得分:7)

不在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);

答案 1 :(得分:0)

正如@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

答案 2 :(得分:0)

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

你必须小心圆角,夹紧和FBO格式。您可能需要16位整数FBO格式。

相关问题