Подтвердить что ты не робот

Рендеринг текстуры без использования двух текстур на iPhone

Можно ли визуализировать текстуру с OpenGL ES 1.1 на iPhone (2G и старше)? Если я привяжу текстуру в качестве буфера рендеринга, это должен быть размер буфера визуализации, который не является размером POT. Но OpenGL ES 1.1 требует, чтобы текстуры были POT.

Возможно, это невозможно сделать на ES 1.1?

4b9b3361

Ответ 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, поэтому я не уверен, что будет помогите вам в этом случае.

Ответ 2

Это можно сделать, все, что вам нужно сделать, это получить следующую мощность в 2 раза больше, чем не-POT.

Затем создайте фреймбуфер:

GLuint aFramebuffer;
glGenFramebuffersOES(1, &aFramebuffer);

И текстура:

GLuint aTexturebuffer;
glGenTextures(1, &aTexturebuffer);

Затем вы делаете ту же текстуру, что и вещи:

glBindTexture(GL_TEXTURE_2D, aTexturebuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glColor4ub(0, 0, 0, 255);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

int area[] = {0.0, 0.0, renderWidth, renderHeight};

glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, area);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, aFramebuffer);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, aTexturebuffer, 0);

Здесь я использовал расширение draw_texture. textureWidth и textureHeight - мощность 2 больших, а renderWidth и renderHeight - ширина и высота rendere. Затем, когда вы привязываетесь к aFramebuffer, он будет рисовать текстуру.