在WPF像素着色效果处理alpha通道
-
18-09-2019 - |
题
是否有一些不寻常的约阿尔法分量是如何在像素着色器处理?我有我的哪些艺人是给我的灰度图像作为背景使用WPF应用程序,该应用程序根据当前状态colorizes这些图像。所以我写了一个像素着色器(使用WPF的Pixel Shader效果库基础设施)作为图像元素产生影响使用。着色器需要一个颜色作为参数,将它转换为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;
}
此工程对像素,其中的α= 1。但是,在刚细的α= 0时,所得到的像素出来白色,而不是通过具有窗口的背景显示。所以我做了一个微小的变化:
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
if (src.a == 0)
return src;
...
和现在的透明部分确实是透明的。为什么?为什么没有在第一个版本的dst.a = src.a
语句实现这一目标?不幸的是,即使这仅仅是一个局部的修复,因为它看起来对我来说,与像素0 <阿尔法<1出来白色。
有谁知道我不理解有关alpha?
解决方案
在一些更多的网络搜索,我发现了一块我失踪。
根据的制品MSDN上的:“WPF使用乘预阿尔法处处为内部的一些性能方面的原因,所以这也是我们解读自定义像素着色器的颜色值的方式。”
因此,修复原来是由α的乘法扔:
float4 main(float2 uv : TEXCOORD) : COLOR
{
...
dst.rgb *= src.a;
return dst;
}
现在我的输出看起来我期待它。
其他提示
0 <阿尔法<1脱出白色
什么范围,你在这里期待?
所有的值都将是在0.0和1.0 ...像素着色器不以离散256米颜色范围工作的范围内,它们被浮点其中1.0是最大强度。
如果你的计算最终将R / G / B值> 1.0,你会得到白...
哥们我工作的一个XNA游戏,我不得不用灰度像素着色器,我得到了你所面临的同样的问题。 我唐诺如果您熟悉XNA环境或没有,但我改变了 SpriteBatch 的绘图 SpriteBlendMode 的从 SpriteBlendMode.None 的为 SpriteBlendMode.AlphaBlend 的,我希望这可以帮助你知道原因。
的问候,