Можно ли рендерить в RGB888 с OpenGL?

Я играл некоторое время с OpenGL на Android на разных устройствах. И если я ошибаюсь, рендеринг по умолчанию всегда выполняется с использованием формата RGB565.

Тем не менее я хотел бы сделать более точные цвета с помощью RGB888.

В документации GLSurfaceView упоминаются два метода, которые относятся к форматам пикселей:

  • Метод setFormat (), открытый SurfaceHolder , возвращаемый SurfaceView.getHolder ()
  • Семейство методов GLSurfaceView.setEGLConfigChooser ()

Если я ошибаюсь, я думаю, что мне нужно использовать только позже. Или использует SurfaceHolder.setFormat() применительно здесь?

Документация класса EGLConfigChooser упоминает EGL10.eglChooseConfig () , чтобы узнать, какие конфигурации доступны.

В моем случае это нормально, чтобы вернуться к RGB565, если RGB888 недоступен, но я предпочел бы, чтобы это было довольно редко.

Итак, можно ли использовать RGB888 на большинстве устройств?

Есть ли проблемы с совместимостью или странные ошибки с этим?

У вас есть пример правильного и надежного способа настройки GLSurfaceView для рендеринга RGB888?

На новых устройствах большинство из них должны поддерживать RGBA8888 как собственный формат. Один из способов заставить RGBA-формат цвета – установить прозрачность поверхности, вы все равно захотите выбрать EGLConfig, чтобы лучше угадать конфигурацию каналов в дополнение к буферам глубины и трафарета.

 setEGLConfigChooser(8, 8, 8, 8, 0, 0); getHolder().setFormat(PixelFormat.RGBA_8888); 

Однако, если я правильно прочитал ваш вопрос, вы просите поддержку RGB888 (альфа не волнует), другими словами, RGBX8888, который может не поддерживаться всеми устройствами (ограничение поставщика драйверов).

Однако важно помнить о производительности, поскольку RGBA8888 – это формат цвета, поддерживаемый большинством аппаратных средств графических процессоров. Лучше избегать любых других цветовых форматов (поддерживаемых без поддержки), поскольку это обычно означает преобразование цвета под добавлением ненужной рабочей нагрузки к GPU.

Вот как я это делаю;

 { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // cocos2d will inherit these values [window setUserInteractionEnabled:YES]; [window setMultipleTouchEnabled:NO]; // must be called before any othe call to the director [Director useFastDirector]; [[Director sharedDirector] setDisplayFPS:YES]; // create an openGL view inside a window [[Director sharedDirector] attachInView:window]; // Default texture format for PNG/BMP/TIFF/JPEG/GIF images // It can be RGBA8888, RGBA4444, RGB5_A1, RGB565 // You can change anytime. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_]; glClearColor(0.7f,0.7f,0.6f,1.0f); //glClearColor(1.0f,1.0f,1.0f,1.0f); [window makeKeyAndVisible]; [[Director sharedDirector] runWithScene:[GameLayer node]]; 

}

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