某些设备上没有显示OpenGL ES 2.0纹理

Yoo*_*Lee 1 android textures opengl-es opengl-es-2.0 galaxy

我找到了一个名为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
Run Code Online (Sandbox Code Playgroud)

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

现在这是我不理解和好奇的.当我将我正在使用的图像缩小为512x512的纹理时,GL_TEXTURE_MIN_FILTER设置无关紧要.min过滤器的所有四个设置都有效.

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

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

Mau*_*tti 7

早上好,这是2个纹理非幂的典型例子.

由于多种原因,纹理在分辨率上需要2的幂,这是一个非常常见的错误,每个人都碰巧陷入这个陷阱:)我也是.

2个纹理的非功率在某些设备/ GPU上运行平稳的事实,仅仅取决于OpenGL驱动程序实现,一些GPU清楚地支持它们,其他一些不支持,我强烈建议你去pow2纹理以便能够保证所有设备的功能.

最后但并非最不重要的是,使用2个纹理的非强大功能可能会让你在GPU内存利用率方面处于危险境地,因为大多数接受非powerof2纹理的驱动程序需要在内存中将纹理重新缩放到最接近的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-mapping).扩展GL_OES_texture_npot放宽了这些限制并允许GL_REPEAT和GL_MIRRORED_REPEAT的包装模式,并且还允许使用全套缩小过滤器对npot纹理进行mipmap.

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