问题的上下文是Android环境中的OpenGL ES 2.0。我有一个纹理。显示或使用它没有问题。Opengl ES 2.0:获取纹理大小和其他信息
是否有一种方法知道它的宽度和高度以及其他信息(如内部格式),从它的绑定ID开始?
我需要在不知道纹理大小的情况下将纹理保存到位图。
问题的上下文是Android环境中的OpenGL ES 2.0。我有一个纹理。显示或使用它没有问题。Opengl ES 2.0:获取纹理大小和其他信息
是否有一种方法知道它的宽度和高度以及其他信息(如内部格式),从它的绑定ID开始?
我需要在不知道纹理大小的情况下将纹理保存到位图。
不在ES 2.0中。实际上功能不存在实际上令人惊讶。你可以获得渲染缓冲区的大小,但不是纹理的大小,这看起来不一致。
唯一可用的值是glGetTexParameteriv()
,它们是纹理的FILTER
和WRAP
参数。
它仍然不在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之前使用它。
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端访问它的结果,你将不得不将纹理作为统一传递给着色器,并输出纹理大小作为着色器输出中的g个组件。将该着色器应用于绘制到1x1px FBO的1x1px图元,然后用glReadPixels
从GPU中回读绘制的值。
你必须小心舍入,夹紧和FBO格式。您可能需要一个16位整数FBO格式。