текстуры NPOT поддерживаются на оборудовании PowerVR SGX, но имеют ограничения. Текстуры NPOT не могут использовать mipmaps, должны быть 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 вообще не существует, так что это дополнение там.