问题的背景是Android环境中的OpenGL ES 2.0。我有一个纹理。没有问题显示或使用它。
是否有一种方法可以从其绑定ID开始知道其宽度和高度以及其他信息(如内部格式)?
我需要在不知道纹理大小的情况下将纹理保存到位图。
答案 0 :(得分:7)
不在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);
答案 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格式。