Я пытаюсь отобразить плавный градиент от 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. Я не вижу способа, как вызвать такую функцию, и я даже не уверен, что это имеет смысл.
Спасибо за любые предложения.