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参数会被完全忽略。 - 修复步骤:
- 显式关闭自动归一化:将
D2D1_CONVOLVEMATRIX_PROP_PRESERVE_ALPHA设置为FALSE。 - 重新设置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
相关产品推荐
相关产品推荐

