我找到了一个名为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
仅在使用mipmap将GL_TEXTURE_MIN_FILTER
设置为过滤器时才会呈现纹理。因此,当GL_TEXTURE_MIN_FILTER
设置为最后两个时,它就可以工作。
现在这是我不理解和好奇的。当我将我正在使用的图像缩小为512x512的纹理时,GL_TEXTURE_MIN_FILTER
设置无关紧要。 min过滤器的所有四个设置都有效。
所以我的问题是,对纹理使用min过滤器时是否需要图像的尺寸?比如我需要使用方形图像吗?包装样式或磁过滤器的配置等其他问题是否可以成为问题?
或者它看起来像是设备的OpenGL实现错误?
答案 0 :(得分: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) 尺寸。换句话说,宽度和高度不需要是a 两个人的力量。但是,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。
我建议你评估一下这本书,因为它对这个主题做了相当不错的报道。