Silverlight 2.5D RPG游戏技巧与特效处理:HLSL渲染动画

126 篇文章 0 订阅
74 篇文章 0 订阅

或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供Direct3D使用。Silverlight无比幸运,从第三个版本开始便已获得了这把旷世利器,虽然目前仅能发挥其不到3层之功力,不过前辈Moonlight近期已向世界宣布全面突破技术壁垒,HLSL的威力提升至7层左右。我们完全可以预料的是,未来Silverlight将手握HLSL,踏着GPU 3D API飞扬驰骋,在RIA页游领域所向披靡,制作一切特效及渲染动画都将成探囊取物般轻松而惬意。

    接下来的问题是HLSL开发困难吗?其实,HLSL特效的制作无外乎“语法”+“公式”;是否还记得我之前曾写过3篇关于HLSL在Silverlight中应用的入门文章Shazzam目前已经发展到了1.3版本,除了无需额外安装DX独立运行等新特性外,还新增了N多现成的特效以及一部脱机入门教程,奇爽无比。就算对HLSL一知半解或云里雾里的朋友,当您下载Shazzam并运行后,其中所演示的效果保证会让您感到无比振奋。是的,或许从那刻起你会决定义无反顾的加入到我们的研究行列,接下来的展示和讲解将会更坚定您这伟大的信念,原来游戏中的特效渲染动画是可以来得如此之简单!

上一节天气系统中的“黑夜+雷电”效果就是通过HLSL分别对场景的地图层(MapLayer)和场景空间(Space)进行ColorTone和LightStreak动画渲染而呈现。毫不夸张的说,只要你有够精通HLSL编程,那么目前网游中的绝大多数特效都可以完美实现。下面,我首先向大家讲解如何通过Shazzam中现成的HLSL特效来实现场景之切换效果,即传统回合制网游中的踩地雷特效。

以最经典的马赛克缩放动画效果为例,首先打开Shazzam并导出(Explore Compiled Shaders)名为Pixelat特效的ps文件;接下来在解决方案中新建一个Effects类,并在其中创建一个继承自ShaderEffect名为EffectBase的特效基类:

HLSL特效基类
     ///   <summary>
    
///  HLSL特效基类
    
///   </summary>
     public   abstract   class  EffectBase : ShaderEffect {

        
///   <summary>
        
///  获取渲染特效的文件地址
        
///   </summary>
         protected  Uri GetShaderUri( string  shaderName) {
            
return   new  Uri( string .Format( " /Effects;component/Source/{0}.ps " , shaderName), UriKind.Relative);
        }

    }

然后将Pixelate.ps文件添加到Source文件夹中,以及在Shader文件夹中创建一个关于该特效的驱动类,代码由Shazzam中拷贝出来,让它继承自ShaderEffect并稍微做些修改后即告完成:

Pixelate马赛克缩放
     ///   <summary>
    
///  马赛克切换
    
///   </summary>
     public   class  Pixelate : EffectBase {

        
public   static   readonly  DependencyProperty InputProperty  =  ShaderEffect.RegisterPixelShaderSamplerProperty( " Input " typeof (Pixelate),  0 );
        
public   static   readonly  DependencyProperty ProgressProperty  =  DependencyProperty.Register( " Progress " typeof ( double ),  typeof (Pixelate),  new  PropertyMetadata((( double )(30D)), PixelShaderConstantCallback( 0 )));
        
public   static   readonly  DependencyProperty Texture2Property  =  ShaderEffect.RegisterPixelShaderSamplerProperty( " Texture2 " typeof (Pixelate),  1 );

        
public  Pixelate() {
            
this .PixelShader  =   new  PixelShader() { UriSource  =  GetShaderUri( " Pixelate " ) };
            
this .UpdateShaderValue(InputProperty);
            
this .UpdateShaderValue(ProgressProperty);
            
this .UpdateShaderValue(Texture2Property);
        }

        
public  Brush Input {
            
get  {  return  ((Brush)( this .GetValue(InputProperty))); }
            
set  {  this .SetValue(InputProperty, value); }
        }

        
///   <summary> The amount(%) of the transition from first texture to the second texture.  </summary>
         public   double  Progress {
            
get  {  return  (( double )( this .GetValue(ProgressProperty))); }
            
set  {  this .SetValue(ProgressProperty, value); }
        }

        
public  Brush Texture2 {
            
get  {  return  ((Brush)( this .GetValue(Texture2Property))); }
            
set  {  this .SetValue(Texture2Property, value); }
        }
    }

最终Effects项目的结构图如下:

使用时我们首先创建Pixelate特效的实例并作为Effect赋值给Space,然后通过Storyboard对该Pixelate实例的Progress参数进行动画即可实现场景的马赛克缩放动画渲染:

                        Pixelate pixelate  =   new  Pixelate();
                        space.Effect 
=  pixelate;
                        Storyboard storyboard 
=   new  Storyboard();
                        DoubleAnimation doubleAnimation 
=   new  DoubleAnimation() {
                            From 
=   0 ,
                            To 
=   100 ,
                            Duration 
=   new  Duration(TimeSpan.FromMilliseconds( 2000 )),
                            EasingFunction 
=   new  ExponentialEase() { EasingMode  =  EasingMode.EaseIn }
                        };
                        Storyboard.SetTarget(doubleAnimation, pixelate);
                        Storyboard.SetTargetProperty(doubleAnimation, 
new  PropertyPath( " Progress " ));
                        storyboard.Children.Add(doubleAnimation);
                        EventHandler handler 
=   null ;
                        storyboard.Completed 
+=  handler  =  (s1, e1)  =>  {
                            Storyboard sb 
=  s1  as  Storyboard;
                            sb.Stop();
                            sb.Completed 
-=  handler;
                            space.Effect 
=   null ;
                        };
                        storyboard.Begin();

只要是Shazzam上能够成功运行的现有的或自己编写的HLSL效果,我们都可以按照上述步骤将之运用到我们的Silverlight游戏中,仅仅1分钟而已,仅仅占用1KB的空间,如此非凡的效果,您是否开始有些心动了?:

 

 

 

除了可以对场景进行渲染处理外,把HLSL特效用到角色的修饰上同样可以达到非常酷的效果。当然了,首先要做的也是确保角色的内部层次划分清楚以达到分层渲染的效果:

    当鼠标悬停于某个角色时,我们可以仅对其铠甲(身体)部件进行发光渲染;

需要制作角色阴影时,我们映射的仅是角色的整个实体层,即铠甲+武器+骑乘道具:

非常值得一提的是,MonoChrome是一个用于变色的HLSL算法着色效果,我在其HLSL源码基础上稍微做了些修改,增加了对全透明色的判断,即可通过赋予RPB值将一张带透明的图像所有非透明颜色都转换成同一系颜色,常用的场合比如回合制、即时战略等类型游戏中的阵营旗帜及兵种颜色等,仅需一套素材即可区分实现任意国家和对象。

在我们的2.5D RPG中,非常多的场合我们都会用这个简约而不简单的MonoChrome。比如角色换装Loading时,我们可对角色不同部位的Loading环进行MonoChrome渲染:

又比如角色持Buff时,我们同样也可以通过对角色的Buff层进行ShiftHue渲染以实现各色效果:

当然了,怪物也不例外,一套素材可幻化出从普通怪到BOSS怪全等级系列角色,非常强大而实用:

总的来说,Silverlight游戏开发还有非常非常多的场景或场合可以通过HLSL的各类渲染以达到升华视觉体验之功效,回望当下的2.5D网游你会发现原来其中的一切特效都显得那么平凡无奇。游戏,若能为玩家提供一场豪华的视听盛宴,那么它真的就算成功了一大半。当然了,我也是HLSL的新手,有时间我真的希望好好的深入学习学习,毕竟这么强大的微软专利,FLASH/FLEX的GLSL只能望尘莫及,Javascript更是想都甭想;当某天Silverlight全面支持HLSL GPU硬件加速时,其他的一切RIA都将成为浮云,化作风中飞沙脱离记忆。很多朋友或许还在无知的抓着什么装机量噱头张牙舞爪,自认能够从中得道升天,岂不知Silverlight 5或将 在2011年4月11日面向全世界发布,带来的更是革命性的全方位Web 3D;外加WIN8必将集成Silverlight,且Silverlight 已稳坐Windows Phone等移动设备的核心地位,是否大家能用发展的眼光看待新事物必定会取代旧事物这样一个符合进化论的历史规律?非常真诚的邀请您加入Silverlight这款新生代RIA的研发行列!让我们一同前行吧!

本节源码下载地址见目录

在线演示地址:http://silverfuture.cn

http://blog.csdn.net/alamiye010/article/details/6247332

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值