【发布时间】:2015-05-09 12:55:25
【问题描述】:
问题的上下文是 Android 环境中的 OpenGL ES 2.0。我有质感。显示或使用它没有问题。
有没有一种方法可以简单地从它的绑定 id 开始知道它的宽度和高度以及其他信息(如内部格式)?
我需要在不知道纹理大小的情况下将纹理保存到位图。
【问题讨论】:
标签: java android opengl-es opengl-es-2.0
问题的上下文是 Android 环境中的 OpenGL ES 2.0。我有质感。显示或使用它没有问题。
有没有一种方法可以简单地从它的绑定 id 开始知道它的宽度和高度以及其他信息(如内部格式)?
我需要在不知道纹理大小的情况下将纹理保存到位图。
【问题讨论】:
标签: java android opengl-es opengl-es-2.0
在 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 所说,没有办法做到这一点,但是您可以在从 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
【讨论】:
我会建议一个 hack 来做这件事。使用 ESSL 的 textureSize 函数。要从 CPU 端访问它的结果,您必须将纹理作为制服传递给着色器,并将纹理大小作为着色器输出的 r & g 组件输出。将此着色器应用于绘制到 1x1px FBO 的 1x1px 图元,然后使用 glReadPixels 从 GPU 回读绘制的值。
您必须小心舍入、钳位和 FBO 格式。您可能需要 16 位整数 FBO 格式。
【讨论】: