iPhone OpenGLES текстуры - цветная полоса - PullRequest
3 голосов
/ 17 мая 2010

У меня проблема с openGL на iPhone, которая, я уверен, должна иметь простое решение!

Когда я загружаю текстуру и отображаю ее, я получаю много того, что, по моему мнению, называется «Color Banding», в результате чего цвета, особенно на градиентах, автоматически «оптимизируются».

Просто чтобы продемонстрировать, что в моем собственном коде ничего плохого не произошло, я загрузил приложение iPhone 'Crashlanding' и заменил фоновое изображение, и, как вы можете видеть на изображении ниже (взято из симулятора), точное происходит то же самое. Изображение слева - это оригинальный PNG, а справа - в игре. Это почти как если бы палитра была уменьшена до 256 цветов.

Скриншот

Я уверен, что это связано с тем форматом, в котором я сохраняю изображение, хотя, хотя это происходит не только с PNG, оно происходит независимо от того, какой формат изображения я выбрал.

Делать мою голову в! Если вы хотите воссоздать это, просто загрузите приложение аварийной посадки и замените фон. Заранее большое спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 17 мая 2010

iPhone не поддерживает 24-битный цветовой формат (8 бит на цвет) . Поддерживает (без сжатия):

  • 565 формат, красный = 5 бит, зеленый = 6 бит, синий = 5 бит
  • 5551 формат, красный = 5 бит, зеленый = 5 бит, синий = 5 бит, альфа (прозрачность) - 1 бит
  • 4444 формат, 4 бита для красного / зеленого / синего / прозрачности.

Итак, если вы нарисуете градиент от 0 до 255 красным цветом, вы увидите 256 градаций в 24-битном формате, но только 32 градации в формате 565/5551 или даже 16 градаций в 4444. 24-битный цвет преобразуется "на лету", так что похоже, что это поддерживается, но это не так.

Вот почему цветная полоса.

/ Это верно для OpenGL ES 1.0, пока не знаю подробностей о 2.0 /

Обновление : Моя ошибка. iPhone поддерживает другие форматы (8888), но, может быть, в самом приложении есть конверсия?

Обновление 2 : Ах, вы используете cocos2d. И не используйте (я предполагаю) прозрачность в вашем изображении. Cocos2d преобразует этот вид изображений в формат 565. Я думаю, что вам придется изменить cocos2d, чтобы "не реализовать" эту оптимизацию, если вам нужно.

0 голосов
/ 07 ноября 2013

Вы должны изменить пиксельный формат GLView Cocos2d. Вот как это сделать.

Если вы используете шаблон Cocos2d для создания нового проекта, существует файл с именем AppDelegate.m. Найдите этот метод внутри этого файла:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Тогда внутри метода вы найдете:

CCGLView *glView = [CCGLView viewWithFrame:[_window bounds]
                               pixelFormat:kEAGLColorFormatRGB565
                               depthFormat:0
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

(может немного отличаться в зависимости от вашей версии Cocos2d. У меня 2.1)

В любом случае вам просто нужно изменить pixelFormat с kEAGLColorFormatRGB565 (красный, зеленый, синий компоненты по 5, 6 и 5 бит) на kEAGLColorFormatRGBA8 (красный, зеленый, синий и альфа-компонент по 8 бит каждый). Обратите внимание, что это означает большее использование памяти (16 бит против 24 бит) и, возможно, более низкую производительность.

...