1

我找到了一个名为Rajawali的 Android 3D 图形框架,我正在学习如何使用它。我遵循了最基本的教程,它使用 1024x512 大小的 jpg 图像为纹理渲染一个 shpere 对象。它在 Galaxy Nexus 上运行良好,但在 Galaxy Player GB70 上却无法运行。

当我说它不起作用时,我的意思是对象出现了,但没有渲染纹理。最终,我更改了一些在创建纹理时用于 Rajawali 框架的参数并使其工作。这是我发现的。

原因来自GL_TEXTURE_MIN_FILTER设置的地方。在以下四个值中

GLES20.GL_LINEAR_MIPMAP_LINEAR
GLES20.GL_NEAREST_MIPMAP_NEAREST
GLES20.GL_LINEAR
GLES20.GL_NEAREST

GL_TEXTURE_MIN_FILTER仅当未使用 mipmap 将纹理设置为过滤器时才会渲染纹理。因此,当GL_TEXTURE_MIN_FILTER设置为最后两个时,它可以工作。

现在这是我不明白和好奇的地方。当我将用作纹理的图像缩小到 512x512 大小时,GL_TEXTURE_MIN_FILTER设置无关紧要。最小过滤器的所有四个设置都有效。

所以我的问题是,对纹理使用最小过滤器时对图像的尺寸有要求吗?比如我需要使用正方形的图像吗?其他的东西,比如包装样式或磁过滤器的配置是否有问题?

或者它看起来像是设备的 OpenGL 实现错误?

4

1 回答 1

9

早上好,这是 2 纹理非幂的典型示例。

出于多种原因,纹理的分辨率必须是 2 的幂,这是一个非常常见的错误,每个人都遇到过这个陷阱:)我也是。

事实上,非幂 2 纹理在某些设备/GPU 上可以顺利运行,这仅取决于 OpenGL 驱动程序的实现,一些 GPU 清楚地支持它们,而另一些则不支持,我强烈建议您使用 pow2 纹理以便能够以保证所有设备的功能。

最后但同样重要的是,使用非 2 次幂纹理可能会导致 GPU 内存利用率出现灾难性场景,因为大多数接受非 2 次幂纹理的驱动程序需要在内存中将纹理重新缩放到最接近的 2 次幂系数. 例如,具有 520X520 的纹理可能导致 1024X1024 的实际内存映射。

这是您不想要的,因为在现实世界中“大小很重要”,尤其是在移动设备上。

你可以在 OpenGL Gold Book OpenGL ES 2.0 中找到一个很好的解释:

在 OpenGL ES 2.0 中,纹理可以具有非二次方 (npot) 维度。换言之,宽度和高度不需要是2的幂。但是,如果纹理尺寸不是 2 的幂,OpenGL ES 2.0 确实对可以使用的环绕模式有限制。也就是说,对于 npot 纹理,包裹模式只能是 GL_CLAMP_TO_EDGE,而缩小过滤器只能是 GL_NEAREST 或 GL_LINEAR(换句话说,不是 mip-mapped)。扩展 GL_OES_texture_npot 放宽了这些限制并允许 GL_REPEAT 和 GL_MIRRORED_REPEAT 的包装模式,还允许使用完整的缩小过滤器集对 npot 纹理进行 mipmap。

我建议你评估这本书,因为它对这个主题做了相当不错的覆盖。

于 2012-07-11T07:29:20.713 回答