【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效。效果如下图:
Angle=0;BlurAmount=0.1;

Angle=45;BlurAmount=0.1;

看看源代码:
++++++++++++++++++++++++++++++++++++++
//模糊的角度
float Angle : register(C0);
//模糊的数量
float BlurAmount : register(C1);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c = 0;
//0.0174533的含义是2*PI/360,这里是将角度转化为弧度
float rad = Angle * 0.0174533f;
//计算x、y轴的偏移分量
float xOffset = cos(rad);
float yOffset = sin(rad);
//
for(int i=0; i<16; i++)
{
//利用角度参数和模糊的数量参数来定义新的纹理坐标
uv.x = uv.x - BlurAmount * xOffset;
uv.y = uv.y - BlurAmount * yOffset;
//将每一次的纹理都叠加
c += tex2D(implicitInputSampler, uv);
}
//求取纹理颜色的平均值
c /= 16;
return c;
}
++++++++++++++++++++++++++++++++++++++
代码非常简单,不过对纹理进行偏移然后叠加,最后将叠加的值进行平均,这种方法还是头一次见,如果不进行最后一步平均,得到的将是纯白的画面,因为经过16次循环叠加的向量c,其中的rgba值都应该远大于1了,所以变成了纯白。
根据这种思想,我们可以稍微改变一下,得到自己想要的效果,比如爆炸效果或者汇聚效果等。这里稍作改变如下:
+++++++++++++++++++++++++++++++++++++++
float Scale : register(C0);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c=0;
for(int i=0;i<5;i++)
{
//设置缩放比例
uv.xy/=Scale;
//设置缩放后的原图中心依然位于整个画面的中心位置
uv.xy+=(1-1/Scale)/2;
c+=tex2D(implicitInputSampler,uv);
}
c/=5;
return c;
}
+++++++++++++++++++++++++++++++++++++++
设置Scale为1.02,则得到如下效果:

Scale=1.06

Scale=0.9

采用这个方法,利用不同的算法可以很方便地得到各种不同的特效。
【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]的更多相关文章
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果) 浮雕效果主要有两个参数:Amount和Wid ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来 ...
- V-rep学习笔记:Reflexxes Motion Library 3
路径规划 VS 轨迹规划 轨迹规划的目的是将输入的简单任务描述变为详细的运动轨迹描述.注意轨迹和路径的区别:Trajectory refers to a time history of positio ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- V-rep学习笔记:Reflexxes Motion Library 2
VREP中的simRMLMoveToPosition函数可以将静态物体按照设定的运动规律移动到指定的目标位置/姿态.If your object is dynamically enabled, it ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- HMM的学习笔记1:前向算法
HMM的学习笔记 HMM是关于时序的概率模型.描写叙述由一个隐藏的马尔科夫链随机生成不可观測的状态随机序列,再由各个状态生成不可观測的状态随机序列,再由各个状态生成一个观測而产生观測的随机过程. HM ...
- jvm学习笔记一(垃圾回收算法)
一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...
随机推荐
- [Angular] Show a loading indicator in Angular using *ngIf/else, the as keyword and the async pipe
The network may be unreliable and loading data may take time. Thus it is important to give the user ...
- Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏
Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单 ...
- Linux下kill进程脚本
Linux下kill进程脚本 在Linux有时会遇到需要kill同一个程序的进程,然而这个程序有多个进程,一一列举很是繁琐,使用按名字检索,统一kill Perl脚本 使用方法 kill_all.pl ...
- 【33.20%】【LA 4320】【Ping pong】
[Description] N (3 ≤ N ≤ 20000) ping pong players live along a west-east street(consider the street ...
- js获取滚动条的宽度
function getScrollWidth() { var noScroll, scroll, oDiv = document.createElement("DIV"); oD ...
- Android JNI -基础篇
JNI(Java Native Interface,JAVA本地接口) 可以使Java代码和其他语言写的代码(如C/C++代码)进行交互.为什么要进行交互? 首先,Java语言提供的类库无法满足要求, ...
- Erlang基础知识集锦
http://wenku.baidu.com/link?url=or-8mkUYUM0uVeqCYESGe93YIlh2IDLP7lFOwRlwr8Syf3PeHbwJC5DPCErs4NFrb1p4 ...
- C# 关于反射事件
在frmMain类中的代码 private void StartRun(string tag, string date, bool tipType) { var d ...
- 【icpc网络赛大连赛区】Sparse Graph
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submissi ...
- [NPM] Use package.json variables in npm scripts
In this lesson we will show that you can leverage values that you already have provided in your pack ...