NPOT 纹理are在 PowerVR SGX 硬件上受支持,但有限制。 NPOT 纹理不能使用 mipmap,必须是 2D(无立方体贴图或 3D 纹理)并且必须使用GL_CLAMP_TO_EDGE
用于两个维度的纹理包裹; OpenGL ES 2.0 和 ES 1.1 中的扩展默认支持此功能GL_APPLE_texture_2D_limited_npot
对于 ES 1.1,您可以在运行时检查此扩展是否存在于此代码中:
const char* extensions = (char*) glGetString(GL_EXTENSIONS);
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
由于这只存在于 SGX 而不是 MBX,请注意依赖 NPOT 纹理支持将限制您使用较新的 SGX 设备。当然,依赖 ES 2.0 也会做同样的事情,所以如果这是您的预期目标,那么 NPOT 支持是一个没有实际意义的问题,您可以继续使用 NPOT 纹理。
这是一个替代解决方案,可让您继续使用 ES 1.1 并保留完整的设备支持。将 320x480 纹理放入 512x512 中,用其他背景图块、字形或其他将同时绘制的纹理填充空白(以避免多个glBindTexture
调用),然后使用我最喜欢的 ES 1.1 扩展之一,GL_OES_draw_texture
,将 320x480 部分快速复制到视口上:
int rect[4] = {0, 0, 480, 320};
glBindTexture(GL_TEXTURE_2D, texBackground);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(0, 0, z, 480, 320);
侧边栏:OpenGL ES 2.0 规范本身没有指定对 NPOT 纹理的任何限制;除非我弄错了,否则 Apple 正在施加限制 - 当然,在 ES 1.1 世界中,NPOT 支持根本不存在,因此它是一个补充。