问题描述
我正在尝试在 Asus Rog Phone 2 的屏幕上呈现从 0% 到 10% 灰度的平滑渐变,该屏幕据称具有 HDR10 屏幕。在标准(8 位?)渲染模式下,我可以清楚地看到渐变级别之间的条带。
我按照instructions from Android以如下方式修改了Vulkan tutorial sample code:
- 在 AndroidManifest.xml 中添加了
android:colorMode="wideColorGamut
。 - 将
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);
}
因此,我观察到与原始 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