内容简介:本文介绍透明度叠加算法(Alpha Blending Algorithm),并用 C#/WPF 的代码,以及像素着色器的代码 HLSL 来实现它。对于算法,我只是搬运工,可以随意搜索到。算法详情请查看:对于完全不透明的背景和带有透明度的前景,合并算法为:
本文介绍透明度叠加算法(Alpha Blending Algorithm),并用 C#/WPF 的代码,以及像素着色器的代码 HLSL 来实现它。
算法
对于算法,我只是搬运工,可以随意搜索到。算法详情请查看: Alpha compositing - Wikipedia 。
对于完全不透明的背景和带有透明度的前景,合并算法为:
float r = (foreground.r * alpha) + (background.r * (1.0 - alpha));
这是红色。然后绿色 g
和蓝色 b
通道进行一样的计算。最终合成图像的透明通道始终设置为 1。
在 C# 代码中实现
多数 UI 框架对于颜色值的处理都是用一个 byte
赛表单个通道的一个像素。于是计算会采用 0xff 即 255。
for (int i = 0; i + 4 < length; i = i + 4) { var backB = background[i]; var backG = background[i + 1]; var backR = background[i + 2]; var foreB = foreground[i]; var foreG = foreground[i + 1]; var foreR = foreground[i + 2]; double alpha = foreground[i + 3]; blue = 0; output[i] = (foreB * alpha) + (backB * (1.0 - alpha)); output[i + 1] = (foreG * alpha) + (backG * (1.0 - alpha)); output[i + 2] = (foreR * alpha) + (backR * (1.0 - alpha)); output[i + 3] = 1.0; }
这段代码当然是跑不起来的,因为是下面两篇博客的魔改代码。你需要阅读以下两篇博客了解如何在 WPF 中按像素修改图像,然后应用上面的透明度叠加代码。
话说,一般 UI 框架都自带有透明度叠加,为什么还要自己写一份呢?
当然是因为某些场景下我们无法使用到 UI 框架的透明度叠加特性的时候。例如使用 HLSL 编写像素着色器的一个实现。
下面使用像素着色器的实现是我曾经写过的一个特效的一个小部分,我把透明度叠加的部分单独摘取出来。
在像素着色器中实现
以下是 HLSL 代码的实现。Background 是从采样寄存器 0 取到的颜色采样,Foreground 是从采样寄存器 1 取到的颜色采样。
这里的计算中,背景是不带透明度的,而前景是带有透明度的。
/// <description>透明度叠加效果。</description> sampler2D Background : register(s0); sampler2D Foreground : register(s1); float4 main(float2 uv : TEXCOORD) : COlOR { float4 background = tex2D(Background, uv); float4 foreground = tex2D(Foreground, uv); float alpha = foreground.a; float r = (foreground.r * alpha) + (background.r * (1.0 - alpha)); float g = (foreground.g * alpha) + (background.g * (1.0 - alpha)); float b = (foreground.b * alpha) + (background.b * (1.0 - alpha)); float a = 1.0; return float4(r, g, b, a); }
如果要测试的图片都是不带透明度的,那么可以通过自己设一个透明度来模拟,传入透明度值 Alpha。
/// <description>透明度叠加效果。</description> /// <type>Double</type> /// <summary>采样 2 的叠加透明度。</summary> /// <minValue>0.0</minValue> /// <maxValue>1.0</maxValue> /// <defaultValue>0.75</defaultValue> float Alpha : register(C0); sampler2D Background : register(s0); sampler2D Foreground : register(s1); float4 main(float2 uv : TEXCOORD) : COlOR { float4 background = tex2D(Background, uv); float4 foreground = tex2D(Foreground, uv); float alpha = Alpha; float r = (foreground.r * alpha) + (background.r * (1.0 - alpha)); float g = (foreground.g * alpha) + (background.g * (1.0 - alpha)); float b = (foreground.b * alpha) + (background.b * (1.0 - alpha)); float a = 1.0; return float4(r, g, b, a); }
参考资料
以上所述就是小编给大家介绍的《透明度叠加算法:如何计算半透明像素叠加到另一个像素上的实际可见像素值(附 WPF 和 HLSL 的实现)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- HQChart 1.9500 版本发布, 分时图支持叠加多个指标
- 半小时轻松玩转WebGL滤镜技术系列(三)多滤镜叠加
- Istio与Kubernetes叠加后的快感从何而来?
- c# – 如何将两个图标合并在一起? (在另一个图标上叠加一个图标)
- 掌握web开发基础系列--物理像素、逻辑像素、css像素
- CSS教程:图片使用混合模式和颜色叠加filter滤镜,改变PNG图标颜色
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Types and Programming Languages
Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00
A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!