Android 上的 HDR 渐变不可能?

问题描述

我正在尝试在 Asus Rog Phone 2 的屏幕上呈现从 0% 到 10% 灰度的平滑渐变,该屏幕据称具有 HDR10 屏幕。在标准(8 位?)渲染模式下,我可以清楚地看到渐变级别之间的条带。

我按照instructions from Android以如下方式修改Vulkan tutorial sample code

  • 在 AndroidManifest.xml 中添加android:colorMode="wideColorGamut
  • VkSwapchainCreateInfoKHR.imageFormatVkAttachmentDescription.formatVkImageViewCreateInfo.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);
}

因此,我观察到与原始 8 位(?)模式完全没有区别。我不太确定如何调试它以及尝试什么。

我还尝试在启用 HDR 选项的情况下在 Unity 中实现相同的效果。在那里我看到所有中间渲染通道(在正向模式下)渲染为 Float16,但最后一个额外通道可能将其转换为 RGB8。视觉结果又是同样的条带。

这让我怀疑这是否不是由某些缺少的设置引起的。在另一个线程中,我看到了关于 Window.setFormat(PixelFormat)SurfaceHolder.setFormat(PixelFormat) 的讨论,但我不确定这与原生 Android 应用程序有何关联。我看不到如何调用这样的函数,我什至不确定它是否有意义。

感谢您的任何建议。

解决方法

你在哪里设置 HDR? HDR是PQ传递函数,不是10bit,不是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

通过进一步链接查看此问题 What is the difference between Display.HdrCapabilities and configuration.isScreenHdr

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...