4

我在 Direct2D 中绘制位图。位图利用透明度(Alpha 通道)。

混合看起来不对。

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

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

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

Direct2D 可以相对于 gamma 显示透明度吗?我该怎么做?任何帮助表示赞赏。

Direct2D 与 Gamma 校正混合

4

2 回答 2

2

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

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

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

请参阅 PNG 规范的alpha 通道处理部分。特别要注意这一点:

计算复合样本值的方程是

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

其中 alpha 值以及输入和输出样本值表示为 0 到 1 范围内的分数。此计算应使用强度样本(不是伽马编码样本)执行

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

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

于 2016-11-24T14:26:12.870 回答
1

Direct-2D 1.0 HwndRenderTarget 直接对像素值执行混合计算。这会导致使用 alpha 通道合成标准 sRGB 图像时出错。错误是因为 Direct 2D 将伽马压缩强度值视为线性强度值。

忽略 gamma 会导致合成质量差、几何图形抗锯齿、图像大小调整和文本渲染。

有一种解决方法,即“预变形”位图的 alpha 值以补偿混合计算引入的错误。

示例:左侧图像是通过在线性色彩空间中执行混合正确合成的,中心图像是 Direct 2D(阴影太暗且“对比度”),右侧图像是预变形 Alpha 通道后的 Direct2D。

直接 2D 渲染 alpha 混合到黑暗和“对比”

见:https ://bel.fi/alangila/lcd/alpcor.html

更新!:较新版本的 Direct-2D (1.1) 支持正确执行混合的 SRGB 后缓冲区。使用 IDXGIFactory2::CreateSwapChainForHwnd() 来使用改进的颜色深度选项。

于 2016-12-02T07:43:25.220 回答