在像素着色器中如何处理 alpha 分量有什么不寻常的地方吗?我有一个 WPF 应用程序,我的艺术家给我灰度图像用作背景,应用程序根据当前状态为这些图像着色。因此,我编写了一个像素着色器(使用 WPF 像素着色器效果库基础结构)作为图像元素的效果。着色器将颜色作为参数,将其转换为 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 < 1 的像素是白色的。
有谁知道我对 alpha 不了解的地方?