【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]

  • 时间:
  • 浏览:1
  • 来源:大发PK10APP下载_大发PK10APP官方

float4 main(float2 uv : TEXCOORD) : COLOR

{

 //定义2d向由中心指向某一纹理坐标的向量

   float2 dir = uv - center;

   //求取向量的长度,l的值域为[0,√2/2]

   float l = length(dir);

   //向量除以此人 的长度我希望单位向量,只用于表示方向

   dir = dir/l;

   //求取向量和水平线的夹角,这里值域为[-PI/2,PI/2]

   float angle = atan2(dir.y, dir.x);

//为了进行交替的螺旋对流,补救采用类事for循环的流程控制说说,意味着着额外的性能耗费,需用用有另4个值来控制螺旋对流的循环周期,这里采用了有另4个名为距离阈值的参数,remainder和l的关系图为一组周期为distanceThreshold的三角波,见图3

  //值域为[0,1]

   float remainder = frac(l / distanceThreshold);

   //该参数是为了让螺旋周期内两路相反带装束过渡的更为平滑,在波形图上看我希望为了让波形连续。

   float preTransitionWidth = 0.25;

   //定义有另4个参数,控制每个螺旋周期内的对流,每个漩涡周期内共有两路正向带状束和一路反向带装束,分别交替呈现。Fac和remainder的关系见图4

   float fac;  

   //控制对流方向的交替以及波形的连续

   if (remainder < .25)

   {

      fac = 1.0;

   }

   else if (remainder < 0.5)

   {

      fac = 1 - 8 * (remainder - preTransitionWidth);

   }

   else if (remainder < 0.75)

   {

      fac = -1.0;

   }

   else

   {

      fac = -(1 - 8 * (remainder - 0.75));

   }

   //计算基于参数【螺旋深度】的变换深度,意思我希望在时候向量方向的基础上正向意味着着着反向增大扭曲深度

   float newAng = angle + fac * spiralStrength * l;

   //按照螺旋深度计算出来的变换深度重新定义纹理坐标

   float xAmt = cos(newAng) * l;

   float yAmt = sin(newAng) * l;

     

   float2 newCoord = center + float2(xAmt, yAmt);

   //按照新的纹理坐标对时候的采样器进行纹理的渲染,得出最终的结果

   return tex2D( implicitInputSampler, newCoord );

}

4 facremainder的关系图

3 remainderL的关系图

有必要说的是逆向的解读别人的算法是有另4个非常痛苦的过程,还都还可以了通过特效展示结合算法文件此人 去构建算法模型方可,合适这是我笨人所采用的笨法子 :)

图1 Shader列表

//定义螺旋效果的中心点,默认是(0.5,0.5),存倒进常量寄存器C0里

float2 center : register(C0);

//定义螺旋效果的深度

float spiralStrength : register(C1);

//距离的阈值

float distanceThreshold : register(C2);

//--------------------------------------------------------------------------------------

// 像素着色器

//--------------------------------------------------------------------------------------

总结一下心得:

熟悉Silverlight的人都知道,SL含有一物名为Pixel Shader,江湖人称像素着色器。是Sl中能不还都还可以了单独操控像素的一门技术。SL3中集成了有另4个Shader,一为DropShadowEffect,二谓BlurEffect,可为用户产生投影与模糊的效果。此外,MS还为守护应用应用程序员开辟了自定义通道,守护应用应用程序员能不还都还可以了自行编写Shader文件,并通过C#封装,最终应用在SL中。而编写Shader文件则需用采用HLSL(高级着色器语言High-Level-Shader-Language),正如当年新手上路用文本文件编写JavaHelloWorld守护应用应用程序一样,Shader同样能不还都还可以了用文本文件编写,同样能不还都还可以了用命令行编译。本文是我工作中的类事琐碎的片段,主要针对的是开源的WPF Pixel Shader Effect Library项目中的Shader源代码进行研究和学习,从而不断的提高此人 。

2、  诸如fordo-while类事类的循环尽量少用

其中提供了18Shader

图2 带状螺旋效果图

因工作意味着着,需用在Silverlight中使用Pixel Shader技术,这对于我来说可不是相当有难度了,首先我是个Java Web开发守护应用应用程序员,从来没正经地学过微软的开发语言和工具;其次,对于算法类事东西,向来有种天生的排斥,一看便头疼。不过项目逼到份上了,还都还可以了硬着头皮上,真告诉我领导们是怎么才能 想的。还是言归正传吧,记录记录此人 的学习心得。

1、  Shader最好用向量,少用标量

//++++++++++++++++++++++++++++++SRC+++++++++++++++++++++++++++++

 再来瞅瞅源代码:

到这里也算大致搞明白类事算法的原理了,对于我来说,不是费了九牛二虎。从中也学到不少,时候此人 写HLSL的时候,总喜欢用for循环来控制流程,比如要写有另4个百叶窗,首先想到的我希望设定百叶窗的间隔,时候 用1/间隔当做循环次数,每次用HLSLTester都勉强能编译过去,时候 一旦到了要编译成ps_2_0ps文件时总会报错,意思是每个Shader只允许64条汇编指令,超出类事数量就编译不过去。想想若是把for循环转变成汇编语言,会产生好多个指令啊,深度能不低吗!!!

BandedSwirl直译说说应该叫做【带状螺旋】效果,初见时着实挺震撼,着实类事算法守护应用应用程序应该很长才是,没想到不过区区400行左右,可见Shader编程之精炼。先看看效果截图:

初学Shader,不知从何做起,前人有高质量的代码,何不直接取来,参详研习。这五天开始英文英文研究BandedSwirl.fx,做点记录:

项目地址为:http://wpffx.codeplex.com/

//定义了2D采样器,意味着着着应用在MediaElement上说说,MediaElement的实时画面便是采样器的内容,存倒进临时寄存器S0中。

sampler2D implicitInputSampler : register(S0);

//++++++++++++++++++++++++++++++SRC+++++++++++++++++++++++++++++

//--------------------------------------------------------------------------------------

// 全局变量,供应用守护应用应用程序设置,在Silverlight中动态改变哪几种参数便成了动画

//--------------------------------------------------------------------------------------

好像ps_3_0没法类事限制,时候 SL貌似只支持ps_2_0,很多很多还是精炼下此人 的代码吧。