Ответ 1
В то время как OpenGL ES 1.1 не поддерживает текстуры без питания двух, новые модели устройств iOS имеют расширение GL_APPLE_texture_2D_limited_npot
, в котором говорится:
Обычный OpenGL ES 1.X текстурирование ограничивается изображениями с силой два (POT). APPLE_texture_2D_limited_npot расширение уменьшает эти размеры ограничения для 2D-текстур. существуют ограничения на куб карты и 3D-текстуры, если они поддерживаются.
Нет дополнительных процедурных или enumerant API, введенный этим кроме того, что реализации, которая экспортирует строка расширения позволит приложение для передачи в 2D-текстуре размеры, которые могут быть или не быть мощность двух.
В отсутствие OES_texture_npot, который снимает эти ограничения, ни mipmapping, ни способы переноса кроме CLAMP_TO_EDGE, поддерживаются в сочетании с 2D-текстурами NPOT. 2D-текстура NPOT с режимом обертывания это не CLAMP_TO_EDGE или minfilter, который НЕ БЛИЖЕ или LINEAR считается неполным. Если такая текстура связана с текстурой единица, это как бы отображение текстуры были отключены для этой текстурной единицы.
Вы можете использовать следующий код, чтобы определить, поддерживается ли это расширение на вашем устройстве (взято из книги iPhone 3D Programming от Philip Rideout):
const char* extensions = (char*) glGetString(GL_EXTENSIONS);
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
На этих устройствах вы должны иметь возможность использовать текстуры без силы двух, если вы установите правильную упаковку текстур:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
К сожалению, этот пример приложения, который у меня есть для текстуры без силы двух, использует OpenGL ES 2.0, поэтому я не уверен, что будет помогите вам в этом случае.