原文:WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下)

本想只用两节来完成关于HLSL自定义渲染相关知识的讲解,鉴于最近非常的多的朋友对此相当感兴趣,想知道最多关于这些特效在实际开发中该如何使用及性能相关问题。那么本节我将以一个比较完整的游戏场景为例,向大家讲解HLSL自定义渲染特效的综合应用。

布置一个游戏场景首先要做的是准备素材,这些素材包括地图背景、天气背景、主角、对象及其他的等物体:

素材有了,接下来我们需要定义如何渲染,首当其冲的当然是去背,因为很多素材都是纯黑色背景,要在实际游戏中使用则必须去掉黑色背景色,那么本节将用到的去背Shader是我在第六节的基础上增加了一个全局参数新的Shader,这样可以根据实际黑色深度进行定量去背(关于去背:为什么很多游戏那么麻烦要用黑色背景的jpg图片+渲染,而不是直接使用透明背景的png图片?这涉及到图片格式占用的空间问题,同尺寸的jpg图片比png图片小非常多,并且在传统的网络游戏中,显卡GPU就是拿来渲染用的,不用也白不用;只是目前的Silverlight版本在处理渲染上大量使用的是CPU而非GPU,有些遗憾)。

本场景中的天气是雷电天气,乌云中将不时的释放出闪电,那么我们就需要为乌云添加闪光渲染,并且该闪光是不定时的随机连续两次闪烁,这样设定将更加逼真:

//乌云

Carrier.Children.Add(new Image() {

Source = Super.GetImage("Clouds", "png"),

Effect = lightStreak,

});

BeginShaderAnimation(lightStreak, 0, 1, 0.1, "Attenuation");

int count;

private void storyboard_Completed(object sender, EventArgs e) {

count += 1;

storyboard.BeginTime = count % 2 == 0 ? TimeSpan.FromSeconds(random.Next(8)) : TimeSpan.FromSeconds(0);

storyboard.Begin();

}

最后我们来实现主角的多重渲染(级联渲染)。

所谓多重渲染即多个渲染用在同一个对象上。例如网络游戏中,玩家的武器是发光的,玩家的背景是去背的,同时中毒、冰冻等状态时还会被渲染成某种单色等。

实现多重渲染的前提是必须将对象分解成多个部分,局部渲染后再整体渲染。那么本节我将对主角进行色相变化渲染及整体去背渲染,主要实现代码如下:

MonochromeShader = new PixelShader() {

UriSource = Super.GetUri("Monochrome.ps")

};

Monochrome monochrome = new Monochrome(MonochromeShader);

//精灵

colorKeyAlpha = new ColorKeyAlpha(colorKeyAlphaShader) {

Value = 0.01,

};

spirit = new Spirit() {

Start = 0,

End = 3,

Direction = 3,

BodyWidth = 65,

BodyHeight = 94,

BodyFileName = "Player",

BodyFileType = "png",

Effect = colorKeyAlpha

};

spirit.Body.Effect = monochrome;

BeginShaderAnimation1(monochrome, 0, 255, 2, "FilterARGBcolor");

上面代码的黄色部分即实现了主角的双重渲染:

嘿嘿~整个场景设定完成,最后为了达到真实的游戏场景模拟,我还增加了主角移动等逻辑,最终的在线测试Demo:

不知道大家是否能够通过本节的案例讲解对Silverlight的Shader渲染有更深刻的认识?不管怎样,我还是想说那句话:非常的期待Silverlight4,我坚信Silverlight的未来会更好更强大!

作者:深蓝色右手
出处:http://alamiye010.cnblogs.com/
本系列目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。

WPF/Silverlight深度解决方案:(九)HLSL自定义渲染特效之完美攻略(下)的更多相关文章

  1. WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)

    原文:WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中) 通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过 ...

  2. WPF/Silverlight深度解决方案:(六)HLSL自定义渲染特效之完美攻略(上)

    原文:WPF/Silverlight深度解决方案:(六)HLSL自定义渲染特效之完美攻略(上) Shader Effect种位图特效及2种渲染特效,而Silverlight中仅有这2种渲染特效: Bl ...

  3. WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性

    原文 WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性 如果您在使用WPF/Silverlight进行相关动画开发中使用了Storyboard,并对关联属性进 ...

  4. 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_132 最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用 ...

  5. 制作自定义背景Button按钮、自定义形状Button的全攻略(转)

    在Android开发应用中,默认的Button是由系统渲染和管理大小的.而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的.因此,我们在开发产品的时候,需要对默认按钮进行美化.在本篇里,笔者结 ...

  6. Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画

    原文:Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画 或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?层 ...

  7. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

  8. XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端

    XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端   源起一个App项目,Web服务器就一台,已经装了 ...

  9. WPF/Silverlight Layout 系统概述——Arrange(转)

    Arrange过程概述 普通基类属性对Arrange过程的影响 我们知道Measure过程是在确定DesiredSize的大小,以便Arrange过程参考这个DesiredSize,确定给MyPane ...

随机推荐

  1. Ad Infinitum 8 - Math Programming Contest

    比赛链接 A题 如果当前数是1,那么后面无论是几都会加1或者当后面数是1的时候加2,所以记录一下后面的数中1的个数(加2)即可. 如果当前数是2,那么只有当后面的数为1或者为2时才可以加1,所以再记录 ...

  2. Java面试总结-基础篇1

    java多线程-- 自旋锁,偏向锁 好处:可以举Servlet和CGI的对比用户线程和守护线程的区别:用户线程结束后JVM会退出,然后守护线程才会终止(比如垃圾回收线程),如何在java中创建守护线程 ...

  3. Leetcode98. Validate Binary Search Tree验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  4. Django项目:CRM(客户关系管理系统)--52--43PerfectCRM实现AJAX全局账号登陆

    # gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...

  5. 组合数学起步-排列计数[ZJOI2010][BZOJ2111]

    <题面> 数据范围:$1 \leq N \leq 10^6, P \leq 10^9 $ 这个题…… 以为是排列,其实是组合 题目中说是从所有排列中找到Magic的,就是 $p_{i/2} ...

  6. 从零开始Android逆向教程(二)——什么是Xposed

    前言在阅读本文之前,假设你的手机已经root,并且已经成功安装好了 XposedInstaller. Xposed是什么?       Xposed 是一个 Android 平台上的动态劫持框架,通过 ...

  7. LintCode刷题笔记-- Maximum Product Subarray

    标签: 动态规划 描述: Find the contiguous subarray within an array (containing at least one number) which has ...

  8. 基于LSTM对西储大学轴承故障进行分析

    这篇文章是小萌新对西储大学轴承故障进行分析,固定特征为故障直径为0.007,电机转速为1797,12k驱动端故障数据(Drive_End)即DE-time.故障类型y值:滚动体故障,内圈故障,3时,6 ...

  9. 备忘录模式(Memento、Originator、Caretaker)(状态保存,备份恢复)

    定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 类型:行为类 类图: 我们在编程的时候,经常需要保存对象的中间状态,当需要的时 ...

  10. 用 Python 写一个 NoSQL 数据库Python

    NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...