Градиент HDR на Android невозможен?

Я пытаюсь отобразить плавный градиент от 0% до 10% серого на экране Asus Rog Phone 2, который предположительно имеет экран HDR10. В стандартном (8-битном?) режиме рендеринга я четко вижу полосы между уровнями градиента.

Я следовал инструкциям Android, чтобы изменить пример кода руководства Vulkan следующим образом:

  • Добавлено android:colorMode="wideColorGamut в AndroidManifest.xml.
  • Изменены VkSwapchainCreateInfoKHR.imageFormat, VkAttachmentDescription.format и VkImageViewCreateInfo.format на VK_FORMAT_R16G16B16A16_SFLOAT (все для настройки цепочки обмена).
  • Изменил VkSwapchainCreateInfoKHR.imageColorSpace на VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT.

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

layout (location = 0) in vec2 texcoord;
layout (location = 0) out vec4 uFragColor;
void main() {
   uFragColor = vec4(vec3(texcoord.x*0.1), 1.0);
}

В итоге абсолютно никакой разницы с исходным 8bit(?) режимом не наблюдаю. Я не совсем уверен, как его отладить и что попробовать.

Я также пытался реализовать тот же эффект в Unity с включенными параметрами HDR. Там я вижу, что все промежуточные проходы рендеринга (в режиме Forward) рендерятся в Float16, но последний дополнительный проход, скорее всего, преобразует его в RGB8. Визуальный результат — снова та же полоса.

Это заставляет меня задаться вопросом, не вызвано ли это какой-то отсутствующей настройкой. В другом потоке я видел обсуждение Window.setFormat(PixelFormat) или SurfaceHolder.setFormat(PixelFormat), но я не уверен, как это связано с родным приложением для Android. Я не вижу способа, как вызвать такую ​​функцию, и я даже не уверен, что это имеет смысл.

Спасибо за любые предложения.


person erkil1452    schedule 04.04.2021    source источник
comment
Проверьте этот ответ: stackoverflow.com/questions/49776684/   -  person PerracoLabs    schedule 05.04.2021
comment
@PerracoLabs Спасибо, но моя проблема кажется другой. Полосы, которые я наблюдаю, распределены равномерно, поэтому я не подозреваю, что проблема в гамме. Я вижу 25 и полосы для диапазона оттенков серого от 0 до 0,1, чего я и ожидал от 8-битного дисплея. Я надеюсь добиться 10-битного режима отображения и сделать шаги незаметными.   -  person erkil1452    schedule 05.04.2021


Ответы (1)


Где вы настраиваете HDR? HDR — это функция передачи PQ, ни 10-битная, ни BT.2020 не имеет к HDR никакого отношения.

https://developer.android.com/training/wide-color-gamut

Это говорит только о WCG.

Это должно использоваться для запуска HDR. https://developer.android.com/ndk/reference/struct/a-hdr-metadata-smpte2086

Для Java это следует использовать для проверки наличия HDR. https://developer.android.com/reference/android/view/Display.HdrCapabilities?hl=en

См. этот вопрос с дополнительными ссылками В чем разница между Display.HdrCapabilities и configuration.isScreenHdr

person Валерий Заподовников    schedule 09.05.2021