unity 描边shadershader 人物走入草丛,草的晃动特效特效怎么做

【猫猫的Unity Shader之旅】之初识屏幕特效
  Shader除了可以处理模型的显示效果外,还有一个腻害的功能就是对要渲染的画面进行整体的处理,也就是屏幕特效。常见的比如《鬼泣4》里的动态模糊效果,景深效果,还有一些全局的颜色矫正,比如可以做出像《英雄联盟》中英雄死亡后的屏幕变灰的效果。Unity中实现屏幕特效需要用到一个脚本和一个Shader来完成。
利用脚本搭建一个屏幕特效系统
  要实现屏幕特效,首先需要面临的一个问题是特效作用于何处。既然说屏幕特效是对画面的一个整体控制,那么这个被作用的对象就应该能控制整个画面。在Unity中,这个对象就是摄像机。利用脚本,我们可以连接摄像机和Shader,在摄像机进行画面的渲染之前先经过Shader的处理。
  首先定义两个必要的变量,分别表示屏幕特效用到的材质和Shader。
private Material curM
public Shader curS
  为了方便,定义一个材质的属性,当curMaterial为null时,动态创建一个材质。当然,我们也可以在Start里面先创建好。
Material material
if (curMaterial == null)
curMaterial = new Material(curShader);
curMaterial.hideFlags = HideFlags.HideAndDontS
return curM
  这个hideFlag表示我们动态创建的材质不会进行保存,因为它只是个临时的材质。在使用屏幕特效之前,我们首先应该检测下当前设备是不是支持屏幕特效,以及脚本所需的参数和资源有没有准备好。
void Start () {
if (!SystemInfo.supportsImageEffects)
enabled = false;
if (!curShader && !curShader.isSupported)
enabled = false;
  为了真正地实现对画面的控制,Unity提供了一个回调函数OnRenderImage(RenderTexture source, RenderTexture dest)。这两个RenderTexture表示渲染纹理。如果我们对画面不做任何处理的话,需要用Graphic.Blit(source, dest)把源纹理拷贝到目标纹理。这里的RenderTexture就是表示我们当前的画面是被当做一张贴图来表示的。
void OnRenderImage(RenderTexture source, RenderTexture dest)
Graphics.Blit(source, dest);
  因为我们要让source先经过Shader处理,所以需要传入使用的材质:
void OnRenderImage(RenderTexture source, RenderTexture dest)
if (material != null)
Graphics.Blit(source, dest, material);
Graphics.Blit(source, dest);
  这样就通过材质将脚本和Shader关联到一起了,完整代码如下:
using UnityE
using System.C
public class ImageEffect : MonoBehaviour {
private Material curM
public Shader curS
Material material
if (curMaterial == null)
curMaterial = new Material(curShader);
curMaterial.hideFlags = HideFlags.HideAndDontS
return curM
void Start () {
if (!SystemInfo.supportsImageEffects)
enabled = false;
if (!curShader && !curShader.isSupported)
enabled = false;
void Update () {
void OnRenderImage(RenderTexture source, RenderTexture dest)
if (material != null)
Graphics.Blit(source, dest, material);
Graphics.Blit(source, dest);
void OnDisable()
if (curMaterial)
DestroyImmediate(curMaterial);
Vertex&Fragment Shader
  屏幕特效另一个比较特殊的地方是它不能用Surface Shader,为了使用屏幕特效,我们需要Unity Shader的另一种形式:Vertex & FragMent Shader,或者叫可编程Shader。
  仅仅作为屏幕特效的基础介绍的一篇,这里我们没有必要深入介绍Vertex&Fragment Shader,只需要大概了解下它的结构就好:
Shader "Custom/ImageEffect" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
SubShader {
Tags { "RenderType"="Opaque" }
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fast
#include "UnityCG.cginc"
fixed4 frag(v2f_img v) : COLOR
return fixed4(1.0, 0.0, 0.0, 1.0);
FallBack "Diffuse"
  无需关注太多细节,只需要关注两个地方。一是#pragma指定了这个Shader的vertex和fragment方法,我们说过一个Shader执行的四个步骤,在Surface Shader中以四个函数来表示,分别是vert,surface,LightingXXX和finalcolor,在Vertex&Fragment Shader中这四个步骤合成了两个步骤(更准确说是Surface Shader拆成了四个步骤),后三个阶段统一为fragment阶段,逐片段进行处理,计算出最终颜色。虽然片段≠像素,但是由于它们是类似的,这里我们可以用fragment方法来处理屏幕特效的画面。
  另一个需要关注的就是fragment方法本身。我们对屏幕特效大部分的处理都要在这里进行,最终计算出摄像机渲染的某一位置的最终颜色值,在这里,我们简单地显示红色。
  现在,我们把脚本添加到摄像机上,再把Shader添加到脚本上。运行时就可以看到不论场景中放了什么东西,最终效果都是显示一片红色。
  通过定义_MainTex,我们可以使用RenderTexture中的信息,也就是待处理的画面。通过v2f_img中的uv分量可以得到具体的颜色值。v2f_img的定义可以在UnityCG.cginc中找到。对Shader稍作修改,可以显示出应有的画面:
Shader "Custom/ImageEffect" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color("Color", Color) = (1, 1, 1, 1)
SubShader {
Tags { "RenderType"="Opaque" }
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fast
#include "UnityCG.cginc"
uniform sampler2D _MainT
uniform fixed4 _C
fixed4 frag(v2f_img v) : COLOR
fixed4 c = tex2D(_MainTex, v.uv);
return _Color *
FallBack "Diffuse"
  这里我们还定义了一个颜色属性,为了使用这个属性,我们需要对脚本进行修改:
using UnityE
using System.C
public class ImageEffect : MonoBehaviour {
private Material curM
public Shader curS
Material material
if (curMaterial == null)
curMaterial = new Material(curShader);
curMaterial.hideFlags = HideFlags.HideAndDontS
return curM
void Start () {
if (!SystemInfo.supportsImageEffects)
enabled = false;
if (!curShader && !curShader.isSupported)
enabled = false;
void Update () {
void OnRenderImage(RenderTexture source, RenderTexture dest)
if (material != null)
material.SetColor("_Color", color);
Graphics.Blit(source, dest, material);
Graphics.Blit(source, dest);
void OnDisable()
if (curMaterial)
DestroyImmediate(curMaterial);
  最终效果如图:
  屏幕特效非常强大,合理地运用可以极大地丰富画面的视觉效果。然而,由于RenderTexture是一种逐像素的处理,对于性能的消耗也是非常大的。尤其是在移动平台上,屏幕特效的使用更要慎之又慎。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?你似乎来到了没有知识存在的荒原...
来源链接是否正确?用户、话题或问题是否存在?在unity中使用shader制作流光效果;本文转自―蓝鸥Unity培训;流光,关键在于流动;从画法的角度看,流光效果的成本很低,一张流光图,;但是效果很令人印象深刻;你跟随着这篇东西去一步步操作,就能得到一些实际可;在开始写一个简单的流光效果之前,我们先普及一些s;这是一个新建的shader,我只是添加了一些注释;接下去,我们要在此基础上,一步步修改加上流
在unity中使用shader制作流光效果
本文转自―蓝鸥Unity培训
流光,关键在于流动。
从画法的角度看,流光效果的成本很低,一张流光图,一张过滤图,一个渲染遍,即可实现效果。
但是效果很令人印象深刻。
你跟随着这篇东西去一步步操作,就能得到一些实际可用的Shader。
在开始写一个简单的流光效果之前,我们先普及一些shader的知识
这是一个新建的shader,我只是添加了一些注释
接下去,我们要在此基础上,一步步修改加上流光的效果。这里我们使用 surfaceshader,surfaceshader是unity的一个特别设计。
他是pixelshader的一部分,准确的说,前半部分。
Surfaceshader自动生成一个传统的vertexshader和pixelshader,根据你所指定的光照模型。
因为大部分的shader并不干涉光照模型,而只是在像素阶段做一些叠加、混合什么的。
Surfaceshader巧妙的让你可以只关心这一部分,学习的时候,只关注一部分,
恰恰是个优点。
随便准备两张图片,一张底图,一张流光图
这里顺便给出一个快速制作流光图的ps操作方法。
1、弄一个黑色的背景
2、使用渐变工具
其中logo01是底图,无所谓用什么东西,最好选择一张比较暗的图,我们准备采用加法让他变亮,暗一点效果更明显。
我们想使用flow图的alpha通道,flow图延x方向运动,循环往复。至少要让flow图的一个半边全黑,因为加法全黑等于没加。
当使用这半边时完全不加亮
Flow贴图的设置这里要特别说明三个地方
? Alpha from Grayscale 从图片的灰度生成alpha通道,直接制作alpha
通道不直观,灰度图很直观。
这个选项就是让你用一张直观的灰度图生成通道。
你可以不用这个选项,而是自己提供一个有alpha通道的图片
? wrap Mode当uv超出0 1 范围是的取值方法,我们需要让这张图循环往复,
就是利用wrap mode repeat来实现的。
必须使用这个选项
? Format,因为这张图我们只需要一个通道,而且不适合压缩,没有比Alpha8
更适合的存储格式了
可选,只是为了节省内存容量
然后流光Shader 新手拈来,有注释的部分是在空shader基础上增加的
稍微解释一下原理,
把一张贴图的四个顶点的uv连成一个红框,是这样的。
三亿文库包含各类专业文献、专业论文、生活休闲娱乐、中学教育、外语学习资料、文学作品欣赏、幼儿教育、小学教育、高等教育、应用写作文书、59unity中shader制作流光效果等内容。 
 Unity3D游戏开发之高达光之翼&月光蝶效果制作_计算机软件及应用_IT/计算机_专业...然后写一个脚本控制 UV 动画 (material.SetTextureOffset),再写一个 shader ...  shader 实例光照图的实现一般情况在做场景烘焙的时候,场景模型都是使用 unity 系统自带的 shader,其中集成了 lightmap 的 shader 代码,就很容易显示光照图的效果。 ...  Unity内置Shader详解_计算机软件及应用_IT/计算机_专业资料。Unity3D Built-in ...内容和 Normal 中同名的几乎一样,只是添加了半透明效果,因此不再做重复介绍。 ...  光照模型中,我们可以把光照讯息烘培进入一个 2D 贴图,来实现着色器的光照 效果...完成静态光照贴图的制作后。在 unity 中创建 Shader,Material。 直接打开 Shader...  unity自发光透明shader_计算机软件及应用_IT/计算机_专业资料。unity自发光透明...Unity的shader帮助手册(... 9页 1下载券
unity中shader制作流光效... 暂无...  Unity3D Shader入门指南_计算机软件及应用_IT/计算机_专业资料。Unity3D Shader 入门指南(一)分类: Unity3d 17:40 16 人阅读 评论(0) 收藏 举报 u...  Unity3D教程宝典之Shader篇:第十六讲自定义光照模型_计算机软件及应用_IT/计算机_专业资料。Unity3D教程宝典之Shader篇 原创文章如需转载请注明:转载自风宇冲 Unity3D...  Unity3D教程宝典之Shader篇:第四讲制作一个美丽的地球_计算机软件及应用_IT/计算机_专业资料。Unity3D教程宝典之Shader篇原创文章如需转载请注明:转载自风宇冲 Unity...  Unity3D 内置 Shader 详解 Transparent Cutout Shader Family 是对半透明对象 Shader 的一类补充,与 Transparent Shader Family 有所区别的是: Cutout Shader Faimily...金叶过路草
金叶过路草
(C)2017 列表网&琼ICP备号-12&增值电信业务经营许可证B2-&

我要回帖

更多关于 unity3d shader 的文章

 

随机推荐