Opengl ES 2.0:获取纹理大小和其他信息
Opengl ES 2.0 : Get texture size and other info
问题的上下文是Android环境下的OpenGL ES 2.0。我有一个纹理。显示或使用都没有问题。
有没有一种方法可以简单地从绑定 ID 开始了解其宽度和高度以及其他信息(如内部格式)?
我需要在不知道纹理大小的情况下将纹理保存为位图。
不在 ES 2.0 中。功能不存在实际上有点令人惊讶。可以得到renderbuffer的大小,但不能得到纹理的大小,看起来不一致。
唯一可用的是您可以使用 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
我会建议一个黑客来做到这一点。使用 ESSL 的 textureSize 函数。要从 CPU 端访问其结果,您必须将纹理作为统一传递给着色器,并将纹理大小输出为着色器输出的 r & g 组件。将此着色器应用于绘制到 1x1px FBO 的 1x1px 图元,然后使用 glReadPixels
.
从 GPU 读回绘制值
您必须小心舍入、限制和 FBO 格式。您可能需要 16 位整数 FBO 格式。
问题的上下文是Android环境下的OpenGL ES 2.0。我有一个纹理。显示或使用都没有问题。
有没有一种方法可以简单地从绑定 ID 开始了解其宽度和高度以及其他信息(如内部格式)?
我需要在不知道纹理大小的情况下将纹理保存为位图。
不在 ES 2.0 中。功能不存在实际上有点令人惊讶。可以得到renderbuffer的大小,但不能得到纹理的大小,看起来不一致。
唯一可用的是您可以使用 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
我会建议一个黑客来做到这一点。使用 ESSL 的 textureSize 函数。要从 CPU 端访问其结果,您必须将纹理作为统一传递给着色器,并将纹理大小输出为着色器输出的 r & g 组件。将此着色器应用于绘制到 1x1px FBO 的 1x1px 图元,然后使用 glReadPixels
.
您必须小心舍入、限制和 FBO 格式。您可能需要 16 位整数 FBO 格式。