2015-05-09 763 views
4

问题的上下文是Android环境中的OpenGL ES 2.0。我有一个纹理。显示或使用它没有问题。Opengl ES 2.0:获取纹理大小和其他信息

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

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

回答

6

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

正如@Reto Koradi说是没有办法做到这一点,但你可以存储纹理的宽度和高度,当你从加载它在将它绑定到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 
0

我会为此提出一个黑客攻击。使用ESSL的textureSize函数。要从CPU端访问它的结果,你将不得不将纹理作为统一传递给着色器,并输出纹理大小作为着色器输出中的g个组件。将该着色器应用于绘制到1x1px FBO的1x1px图元,然后用glReadPixels从GPU中回读绘制的值。

你必须小心舍入,夹紧和FBO格式。您可能需要一个16位整数FBO格式。