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

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

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

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

不在ES 2.0中。 实际上,function并不令人惊讶。 您可以获得渲染缓冲区的大小,但不能获得纹理的大小,这似乎不一致。

唯一可用的是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); 

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

  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 

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

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