在像素着色器中,关于 alpha 分量的处理是否有什么不同寻常的地方?我的艺术家为我的 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
语句没有实现这一点?不幸的是,即使这样修复,像我这样的人看起来像是alpha值在0到1之间的像素会变成白色。
有人知道我对alpha理解的哪些方面存在误解吗?