- 浏览: 1536450 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
Shader Effect 中文名称为“渲染特效”或“滤镜”, WPF 中自带有 5 种位图特效及 2 种渲染特效,而 Silverlight 中仅有这 2 种渲染特效: BlurEffect ( 模糊渲染 ) 和 DropShadowEffect ( 投影渲染 ) 。由于目前 WPF/Silverlight 被应用的领域还不是很多,大多数开发者仅仅是将之作为 Winform/Webform 的替代品,那么现成的这几种渲染特效已足够应付大多数的场合需要。但是如果您打算利用 WPF/Silverlight 进行更高端的开发,例如动画制作及游戏设计,那么没有少则数十种的自定义渲染特效库是无法满足绚丽多彩的画面需求的。本节我将以 Silverlight 平台为例,向大家介绍如何制作及实现 HLSL 自定义渲染特效。
3.0 是 Silverlight 具有里程碑意义的一个版本,因为从此版本开始,您将能够通过 HLSL 高级着色器语言( High Level Shader Language ,简称 HLSL )为 Silverlight 中的 UIElement 对象制作自定义渲染特效,并且这些特效均为 快速而有效率地通过显卡来完成。举个简单的例子,如果您想让一个动画的系列帧图片在显示的时候去掉无用的黑色 ( 或其他某种颜色 ) 像素(这在游戏开发中再常见不过了,俗称:去背),用代码来实现则必须循环编历图片中的每个像素点,判断为黑色时修改该点为透明(或忽略所有黑色点),这无形中饶了很大一个弯子。其实我们只需创建一个简单的 HLSL 渲染特效 (HLSL Shader Effect) 就可以轻松的实现之,并且可以随意的选择附加或是移除。您此时不禁要问:这么神奇的 HLSL 渲染特效该如何制作和使用呢?嘿嘿,下面且听我慢慢道来。
1 )架设开发环境
首先需要安装 DirectX SDK ,接下来在编辑器的选择上有很多种,例如 FX Composer 和 RenderMonkey 都很好很强大,这里我个人特别推荐安装专门为 WPF/Silverlight 开发的小而精悍的 Shazzam 作为入门级 HLSL 渲染特效编辑器。需要注意的是, Shazzam 在首次运行时需要指定 DirectX SDK 中的 fxc 文件路径,该文件存在于 DirectX SDK 安装目录 \Microsoft DirectX SDK (November 2008)\Utilities\bin\x86\ 下。
2 )制作 HLSL 渲染特效
打开 Shazzam ,我将该编辑器分为 4 个部分:工具菜单,特效库,预览区域,代码区域:
Shazzam 本身已经自带了一些很棒的特效,大家看上图中的特效库中的 *.fx 文件即为已经包装好的特效,此时我选择了名为 Swirl( 旋涡纹 ) 的特效,然后点击菜单栏 Tools 里的 Apply Shader 或直接按 F5 看到的渲染结果即为预览区域中的图象;并且该 Swirl 渲染特效的 HLSL 代码我们可以从代码区域中的 Swirl.fx 中查看到,用过 Photoshop 的朋友都清楚很多滤镜特别是功能强大的滤镜都是带有参数的,同样的,我们在书写 HLSL 时通过定义全局变量来作为参数。那么这些参数我们可以通过代码区域中的 Change Shader Settings 进行修改,并且修改后的效果均会时时的呈现在预览区域中。
掌握了 Shazzam 编辑器的使用后,制作渲染特效就再简单不过了。如果您不熟悉如何编写 HLSL 语言,那么您可以尝试从网上查找些现成的 HLSL 渲染特效或是直接使用自带的这些特效作为起步练习。这里我以实现“灰度”特效为例为大家详细讲解一个渲染特效的整个制作和使用流程。
首先编写出“灰度”特效的 HLSL 代码:
sampler2D implicitInput : register ( s0 );
float factor : register ( c0 );
float4 main ( float2 uv : TEXCOORD ) : COLOR
{
float4 color = tex2D ( implicitInput , uv );
float gray = color . r * 0.3 + color . g * 0.59 + color . b * 0.11 ;
float4 result ;
result . r = ( color . r - gray ) * factor + gray ;
result . g = ( color . g - gray ) * factor + gray ;
result . b = ( color . b - gray ) * factor + gray ;
result . a = color . a ;
return result ;
}
然后将这段代码粘贴进代码区域后按 F5 运行,如果编译通过则预览图片将变成黑白色:
接下来我们需要将此特效保存为 *.ps 格式以供 Silverlight 使用,具体操作为点击工具菜单 Tools 里的 Compile Shader(F7) 生成 ps 文件,然后再点击 View Compile Shaders 会打开编辑器的特效库文件夹路径,此时我们刚才制作的“灰度”渲染特效将保存在此目录中,分别为 temp.fx 和 temp.ps :
我们只需将 temp.ps 复制出来即可,并根据其效果更名为 Gray.ps 。
3 )使用 HLSL 渲染特效
新建一个 Silverlight3 项目,在项目中添加两个文件夹分别命名为: ShaderSource 和 ShaderClass ,顾名思义 ShaderSource 用于存放 ps 文件,那么我们将 Gray.ps 添加进来,并设置其属性如下:
至此,虽然已经可以直接对 ps 文件进行使用了,但是为了能够更好的拓展延伸及规范管理,我们还必须为每个 ps 渲染特效编写一个实体驱动类,该类包含有渲染特效的所有参数 ( 关联属性 ) 定义等。非常幸运的, Shazzam 编辑器已经为我们提供了现成的代码供参考:
我们可以通过代码区域中的选项卡选择显示 C# 或 VB 的自动生成代码,然后在 ShaderClass 文件夹中新建一个名为 Gray.cs 的类,并将代码粘贴进去。此时如果无法编译通过的,则必须将之 Silverlight 化修改,因为这些自动生成的代码是针对 WPF 的 ( 例如将 UIPropertyMetadata 改为 PropertyMetadata ) 。那么修改后的 Gray.cs 完整代码如下:
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Effects;
namespace Silverlight.Shader {
public class Gray : ShaderEffect {
public static DependencyProperty InputProperty = ShaderEffect .RegisterPixelShaderSamplerProperty("Input" , typeof (Gray ), 0);
public static DependencyProperty FactorProperty = DependencyProperty .Register(
"Factor" , typeof (double ), typeof (Gray ), new PropertyMetadata (new double (), PixelShaderConstantCallback(0)));
public Gray(PixelShader shader) {
PixelShader = shader;
this .UpdateShaderValue(InputProperty);
this .UpdateShaderValue(FactorProperty);
}
public virtual System.Windows.Media.Brush Input {
get {
return ((System.Windows.Media.Brush )(GetValue(InputProperty)));
}
set {
SetValue(InputProperty, value );
}
}
public virtual double Factor {
get {
return ((double )(GetValue(FactorProperty)));
}
set {
SetValue(FactorProperty, value );
}
}
}
}
接下来就是在主窗体中实现此 Gray 灰度特效。以 第五节 的源码为例,我们首先需要加载 ps 文件作为像素渲染对象:
PixelShader pixelShader = new PixelShader () {
UriSource = new Uri (
string .Format("/Silverlight;component/ShaderSource/Gray.ps" ), UriKind .Relative)
};
接着以 pixelShader 作为参数创建 Gray 实例,其中的 Factor 为灰度深度:
Gray gray = new Gray (pixelShader) {
Factor = 0
};
最后将此渲染特效赋值给精灵的特效属性:
Spirit.Effect = gray;
嘿嘿,完成了 ~ 呼呼,还是挺累的呢,来张截图吧:
图中的精灵在灰度模式下同样可以毫无破绽的切换装备,嘿嘿 ~ 相当的 Cool 哦,额外的,我还以同样的方法增加了浮雕、去背、卡通材质、反色等几个特效,下面是最终的在线测试 Demo :
HLSL 渲染特效的最大优点在于它的体积非常小却能发挥大作用,稍微有些遗憾的是在目前的 Silverlight3.0 版本中,该渲染特效使用的是 CPU 而非 GPU ,这意味着目前还无法大量的对其进行使用,希望后续版本能将之放在 GPU 的处理上, Silverlight 的春天就看你了! MS
下一节我将为您呈现更加 Cool 的 HLSL 渲染特效动画 ,敬请关注。
发表评论
-
Silverlight Image Source URI : 一个反斜杠引发的血案
2010-01-12 13:10 3585Silverlight Image Source U ... -
SilverLight跨域访问及其常用的几种解决方法
2010-01-06 16:59 5435SilverLight 出于对安全性的考虑默认情况下对UR ... -
有关silverlight中调用webservice的问题!!
2010-01-06 15:07 3338System.InvalidOperationExceptio ... -
Server.UrlEncode、HttpUtility.UrlDecode不同编码
2010-01-06 12:39 3267Server.UrlEncode、HttpUtility.U ... -
LINQ to XML一些基本查询
2010-01-06 12:34 2039/**/ /// /根据元素的名称进行筛选(有命名空 ... -
使用LINQ to XML来查询XML
2010-01-06 12:16 2754使用LINQ to XML来查询XML ... -
给弟弟起步学习软件开发(.Net 方向)的指导,博友们帮助看看,提些意见给他。
2010-01-06 11:15 964在我学习的时候走了至少3年的弯路,那个时候没有人告诉我该如 ... -
LINQ to XML 用 LINQ 查询 XML
2010-01-06 11:15 1510LINQ to XML 用 LINQ 查询 XML ... -
一个实例掌握linq to XML增查删改
2010-01-06 11:10 2250最近忽然想把过去写的I ... -
使用XML LINQ查询和转换XML
2010-01-06 10:37 1497本章包括 n XML LI ... -
XML LINQ简介
2010-01-06 10:32 1563本章包括 n XML LINQ ... -
.Net 中string与byte[]相互转换
2010-01-05 16:43 2428public static byt ... -
正则表达式收集(持久更新)
2010-01-04 15:56 1114正则表达式收集( ... -
网上搜集的webbrower的资料,很有借鉴价值
2010-01-04 15:54 1895http://hi.baidu.com/lovemoe/ ... -
Lexware Assembly Reference Tool for Visual Studio 2005 / 2008
2010-01-04 10:35 1883http://www.codeproject.com/KB/m ... -
Visual Studio的 诡异bug(mscorlib无法引用)
2010-01-04 09:27 2519这个需要手动修改项目的配置文件 添加 <Re ... -
[C#实战]Google Map开发实战参考
2010-01-03 16:48 5773[C# 实战] ... -
复习一下 .Net: delegate(委托)、event(事件) 的基础知识,从头到尾实现事件!
2010-01-02 23:33 2566有这样一道 .Net/C# 面试题:请以事件的概念实现 ... -
ADO.NET Entity Framework简介
2009-12-21 18:46 2696下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序 ...
相关推荐
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十三) 锦上添花之魔法特效装饰 C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十四) 地图编辑器诞生啦! C#开发WPF/Silverlight...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
通过WPF/Silverlight的动画系统,开发者可以创造出各种华丽的技能特效。同时,理解如何将这些视觉表现与游戏规则相结合,如伤害计算、冷却时间等,是构建游戏核心玩法的关键。本教程将探讨如何设计和实现这些游戏...
WPF/Silverlight自定义高性能位图效果的例子。 用的是一个外部二进制文件,直接是有显卡来渲染位图效果,所以性能非常高,效果是图片的波浪水纹化。 一般wpf自带的位图效果 数量有限,而且性能很差,不适合大量使用...
标题中的“wpf/silverlight读取shapefile文件类”是指在Windows Presentation Foundation (WPF)和Silverlight这两个Microsoft的开发框架中,实现读取地理信息系统(GIS)中常用的Shapefile格式的代码类。Shapefile是...
我将在本教程中完全屏弃它所有的弱点,实现它未实现的所有功能,让所有的朋友们均能用WPF/Silverlight进行游戏深度开发 可以通过对App.xaml的StartupUri参数进行修改,实现不同的Window启动首选项 如果编译不通过...
**WPF(Windows Presentation Foundation)和Silverlight**是微软推出的技术,用于构建丰富的、交互性强的桌面和Web应用程序。这两个框架都是基于.NET Framework,并且都提供了强大的图形渲染和用户界面设计能力。 ...
"Toggle Switch Control Library"是开发者社区共享的一个资源,它提供了一个高度自定义和可操作的开关按钮控件,适用于WPF和Silverlight应用程序。 首先,让我们理解WPF和Silverlight是什么。WPF是.NET Framework的...
在本系列教程“WPF/Silverlight动画及游戏”中,我们将深入探讨Windows Presentation Foundation (WPF) 和 Silverlight这两个Microsoft开发的富客户端技术在创建动态用户体验和游戏方面的强大功能。教程涵盖WPF 21至...
- Mozilla的Prism项目是针对Web应用的一个框架,目的是提供一种替代Silverlight和Flash的解决方案,它支持Web应用的模块化和本地化,但最终没有达到与Silverlight和Flash相匹敌的流行度。 总结,WPF、Silverlight和...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) 的源代码 第一部分源码:WPFGameTutorial_PartI.rar(1-20节) 第二部分源码:WPFGameTutorial_PartII.rar (21-26节) 第三部分源码:WPFGameTutorial_Part...
《C#开发WPF/Silverlight动画及游戏系列教程》是一个全面涵盖WPF(Windows Presentation Foundation)和Silverlight技术的游戏开发教程,共计50节课。本教程深入浅出地介绍了如何利用C#语言来构建丰富的用户界面和...
在WPF(Windows Presentation Foundation)和Silverlight这两个微软的UI框架中,图片的放大、缩小以及拖动功能是常见的需求,特别是在开发地图应用或者图像查看器时。这些功能的实现涉及到了图形绘制、用户交互以及...
C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial) (个人收藏) 目录 (一)让物体动起来① (二)让物体动起来② (三)让物体动起来③ (四)实现2D人物动画① (五)实现2D人物动画② (六)完美移动 (七)传说...
Visifire数据可视化的图表控件—— 支持Silverlight 和 WPF。它可以用于WPF和Silverlight应用程序 visifire图表效果。使用API,可创建移动,Web和桌面应用程序的图表。Visifire 能够作为一个Silverlight App嵌入到...
演示如何在WPF和Silverlight中实现UserControl的继承。 在实际工程项目中,XAML程序并不推荐使用继承的方式实现控件,并且由于设计层和逻辑层的分离,导致直接继承UserControl子类并不容易,需要在理解UserControl...