Использовать 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);
Надеюсь это поможет.