Использовать glTexImage2D draw 63*63 image

В андроиде используйте этот код:

glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);

но в iOS не работает, этот код рисует только 64 *64(степень 2)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);

как я могу?

очень благодарны!!!

3 ответа

Решение

Размер текстуры зависит от GPU и реализации OpenGL ES. На iOS принимаются только Power of 2 текстуры. А в формате PVR допускается только квадратная текстура с размером Power 2. Вы должны прочитать их документы перед внедрением. Но для кроссплатформенности желательно использовать Power of 2 с квадратной текстурой.

Используйте это перед вашим glTexImage2D вызов:

// Use tightly packed data
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Более подробная информация здесь: http://www.khronos.org/opengles/sdk/1.1/docs/man/glPixelStorei.xml

[...] GL_PACK_ALIGNMENT Задает требования выравнивания для начала каждой строки пикселей в памяти. Допустимые значения: 1 (выравнивание по байтам), 2 (строки, выровненные по четным номерам байтов), 4 (выравнивание по словам) и 8 (строки начинаются с границ двойного слова). Начальное значение 4. [...]

Это может быть доступно не на всех устройствах. Но любое серьезное устройство, предназначенное в настоящее время, должно поддерживать это. Однако у этого метода есть один недостаток: буфер чтения OpenGL читает только один байт за раз. Таким образом, при использовании 1 вместо значения по умолчанию 4, вызов glTexImage2D будет примерно в 4 раза медленнее. И, конечно, данные не выровнены должным образом в памяти, но это не должно быть проблемой. Я должен порекомендовать использовать текстуры с размерами со степенью двойки, так как недостаток использования текстуры 63х63 намного хуже, чем просто загрузка текстуры 64х64 и корректировка координат текстуры.

Если я вспоминаю iOS, OpenGLES2 может рисовать не мощные 2 текстуры, но в некоторых случаях он их не рисует. Сначала мы говорим о несжатых текстурах, потому что это то, что вы пытаетесь сделать в коде. Во-вторых, вы не дали много информации. Что именно "не работает"? Я предполагаю, что под не работает вы имеете в виду, что вы получаете черную текстуру.

Возможно, у вас есть несоответствие mipmap, например, если вы укажете:

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Задание фильтра минимального масштаба карты mip, когда ваша текстура не имеет уровней карты mip, приведет к черной текстуре. На самом деле, вы не можете использовать mipmaps вообще с не мощными двумя текстурами.

Другое дело, что вы не можете использовать GL_REPEAT с не мощными текстурами. Вы не можете сделать это на iOS для текстур не power 2:

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                        GL_REPEAT);

Вместо этого вы можете сделать это:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
        GL_CLAMP_TO_EDGE);

Надеюсь это поможет.

Другие вопросы по тегам