gpt4 book ai didi

c++ - Direct2D - 如何使用位图进行 Gamma 校正透明度 (alpha)

转载 作者:太空狗 更新时间:2023-10-29 22:58:23 26 4
gpt4 key购买 nike

我在 Direct2D 中绘制位图。位图利用透明度(alpha channel )。

混合看起来不对。

作为测试,我加载了一个 50% 透明度的纯黑色 png 图像,并将其绘制在白色背景上。结果是红色、绿色和蓝色值为 127 (0x7F7F7F) 的像素。这表明 Direct2D 的混合忽略 Gamma 并将颜色值视为线性。

(位图使用常规的 sRGB 颜色空间,每像素 32 位,红色、绿色、蓝色和 Alpha 各 8 位)。它们以 GUID_WICPixelFormat32bppPBGRA 格式加载。

在 sRGB 中,黑色和白色之间的中间混合是 186 (0xBABABA)。这是我想要的理想结果。

Direct2D 能否根据 Gamma 显示透明度?我该怎么做?任何帮助表示赞赏。

Direct2D vs Gamma-correct blend

最佳答案

混合是在线性色彩空间中正确完成的,所以混合 sRGB 像素的过程应该是

  1. 转换为线性
  2. 混合
  3. 转换回 sRGB。

请注意,对于黑色或白色像素,步骤 (1) 和 (3) 是空操作,可以省略。

参见 alpha channel processing PNG规范的一部分。特别要注意这一点:

The equation for computing a composited sample value is

output = alpha * foreground + (1-alpha) * background

where the alpha value and the input and output sample values are expressed as fractions in the range 0 to 1. This computation should be performed with intensity samples (not gamma-encoded samples)

该部分包含用于 alpha channel 处理的示例 C 代码

在提出这个问题时,HWND 渲染目标(绘制到屏幕)不支持线性像素格式;但是,Direct-2D HwndRender 目标现在已被接口(interface) ID2D1DeviceContext 取代。这些是通过 IDXGIFactory2::CreateSwapChainForHwnd() 创建的,支持更多像素格式,例如 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,它会在混合时自动执行正确的色彩空间转换(信息由@Jeff McClintock 提供)。

关于c++ - Direct2D - 如何使用位图进行 Gamma 校正透明度 (alpha),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40782255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com