wpf - 在WPF像素着色器效果中处理Alpha channel

标签 wpf pixel alphablending pixel-shader

关于在像素着色器中如何处理alpha分量,有什么不寻常的地方吗?我有一个WPF应用程序,艺术家为其提供了WPF应用程序,供我使用灰度图像作为背景,并且该应用程序根据当前状态为这些图像着色。因此,我编写了一个像素着色器(使用WPF像素着色器效果库基础结构)以用作对Image元素的效果。着色器将颜色作为参数,将其转换为HSL,以便可以操纵亮度。然后,对于每个灰色像素,它计算一种颜色,该颜色的亮度与源像素的亮度成比例地插在颜色参数和白色之间。

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);

    // ...Do messy computation involving src brightness and color parameter...

    float4 dst;
    dst.r = ...
    dst.g = ...
    dst.b = ...
    dst.a = src.a;
    return dst;
}

这对于alpha = 1的像素来说效果很好。但是在alpha = 0的情况下,结果像素变为白色,而不是让窗口的背景透明。所以我做了一个小小的改变:
float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);
    if (src.a == 0) 
        return src;
    ...

现在透明部分确实是透明的。为什么?为什么第一个版本中的dst.a = src.a语句不能完成该任务?不幸的是,即使这只是部分修复,因为在我看来,0
有人知道我不了解Alpha吗?

最佳答案

经过更多的网络搜索后,我发现了我丢失的那一部分。

an article on MSDN表示:“出于多种性能原因,WPF在内部各处都使用预乘alpha,因此这也是我们在自定义像素着色器中解释颜色值的方式。”

因此解决方法是将乘积与alpha相乘:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    ...
    dst.rgb *= src.a;
    return dst;
}

现在我的输出看起来像我期望的那样。

关于wpf - 在WPF像素着色器效果中处理Alpha channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2204955/

相关文章:

ios - iOS CALayer.zPosition 是否不超越 View 层次结构?

c# - MVVM跨WPF区域实现

c# - 触发 ListView 的 IsSelected 属性(初学者)

c# - LiveCharts2将不断变化的数据绑定(bind)到图表上

wpf - 如何阻止 Powershell WPF 表单关闭

c++ - 如何访问图像上 2 个非线性点之间的所有像素

android - Android中图片GridView的大小相等

android - 如何为 Keras 模型获取 Android 像素 RGB 数组

go - 像谷歌地球一样重新着色图标

c - RGBA,每个 channel 8 位大小的 alpha 反转合成,在 C 中