关于在像素着色器中如何处理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/