You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Direct2D卷积矩阵效果中D2D1_CONVOLVEMATRIX_PROP_DIVISOR参数无效求助

Direct2D ConvolveMatrix特效Divisor参数无效果问题

我在使用Microsoft Direct2D的卷积矩阵特效(ConvolveMatrix Effect)时,发现D2D1_CONVOLVEMATRIX_PROP_DIVISOR参数设置后画面没有任何变化,无论设置什么数值都看不到效果。相关代码如下:

ID2D1Effect* theEffect = nullptr;
m_pDeviceContext->CreateEffect(CLSID_D2D1ConvolveMatrix, &theEffect);

float matrix[9] = {-1, -1, -1, -1, 9, -1, -1, -1, -1};
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_X,3);
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_Y,3);
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_MATRIX, matrix);

// 此设置无效果
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_DIVISOR, 2.0);

问题原因与解决方法

  • 自动归一化机制干扰:Direct2D的ConvolveMatrix特效默认开启D2D1_CONVOLVEMATRIX_PROP_PRESERVE_ALPHA属性,当该属性为TRUE时,特效会自动对卷积核进行归一化,此时手动设置的Divisor参数会被完全忽略。
  • 修复步骤:
    1. 显式关闭自动归一化:将D2D1_CONVOLVEMATRIX_PROP_PRESERVE_ALPHA设置为FALSE。
    2. 重新设置Divisor:关闭自动归一化后,手动配置的Divisor参数才会被应用到卷积计算流程中。

修改后的代码示例:

ID2D1Effect* theEffect = nullptr;
m_pDeviceContext->CreateEffect(CLSID_D2D1ConvolveMatrix, &theEffect);

float matrix[9] = {-1, -1, -1, -1, 9, -1, -1, -1, -1};
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_X,3);
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_Y,3);
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_MATRIX, matrix);

// 关闭自动归一化,让Divisor参数生效
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_PRESERVE_ALPHA, FALSE);
// 此时Divisor设置会正常作用于卷积计算
theEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_DIVISOR, 2.0);
  • 补充说明:如果需要保留Alpha通道的独立处理逻辑,可以在关闭PRESERVE_ALPHA后,手动调整卷积核中Alpha通道的计算规则,或者单独对Alpha通道添加额外处理步骤,避免自动归一化覆盖自定义的Divisor配置。

内容的提问来源于stack exchange,提问作者Jörg Hauschild

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:47:07