U3D次时代shader用什么?自带shader效果蓝鲸游戏在中国弱爆了了

【旧博客转移 -&日 00:24&】
上一篇讲了一下人物边缘发光效果,链接:&,这次我们利用这个Shader来实现人物残影效果
先来看一下效果 &→_→
大概的原理
创建残影:拷贝人物当前Mesh数据作为残影,用MeshFilter+MeshRenderer渲染出来
残影有生命周期、创建间隔:残影从创建到慢慢消失的过程,这里采用透明度淡出
使用X光Shader
Mesh mesh = new Mesh ();
meshRender[i].BakeMesh(mesh);
BakeMesh拷贝网格
拷贝网格很简单,调用SkinnedMeshRenderer的BakeMesh方法
用MeshFilter跟MeshRenderer渲染网格
MeshFilter filter = go.AddComponent&MeshFilter&();
filter.mesh =
MeshRenderer meshRen = go.AddComponent&MeshRenderer&();
meshRen.material = meshRender[i].
meshRen.material.shader = ghostS//设置xray效果
MeshFilter:网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中
MeshRenderer:但是想要渲染出网格,还需要用到MeshRenderer哦
using UnityE
using System.C
using System.Collections.G
public class GhostShadow : MonoBehaviour {
//持续时间
public float duration = 2f;
//创建新残影间隔
public float interval = <span style="color: #.1f;
//边缘颜色强度
[Range(-<span style="color: #, <span style="color: #)]
public float Intension = <span style="color: #;
//网格数据
SkinnedMeshRenderer[] meshR
Shader ghostS
void Start () {
//获取身上所有的Mesh
meshRender = this.gameObject.GetComponentsInChildren&SkinnedMeshRenderer& ();
ghostShader = Shader.Find("lijia/Xray");
private float lastTime = <span style="color: #;
private Vector3 lastPos = Vector3.
void Update () {
//人物有位移才创建残影
if (lastPos == this.transform.position)
lastPos = this.transform.
if(Time.time - lastTime & interval){//残影间隔时间
lastTime = Time.
if (meshRender == null)
for (int i = <span style="color: #; i & meshRender.L i++) {
Mesh mesh = new Mesh ();
meshRender[i].BakeMesh(mesh);
GameObject go = new GameObject();
go.hideFlags = HideFlags.HideAndDontS
GhostItem item = go.AddComponent&GhostItem&();//控制残影消失
item.duration =
item.deleteTime = Time.time +
MeshFilter filter = go.AddComponent&MeshFilter&();
filter.mesh =
MeshRenderer meshRen = go.AddComponent&MeshRenderer&();
meshRen.material = meshRender[i].
meshRen.material.shader = ghostS//设置xray效果
meshRen.material.SetFloat("_Intension", Intension);//颜色强度传入shader中
go.transform.localScale = meshRender[i].transform.localS
go.transform.position = meshRender[i].transform.
go.transform.rotation = meshRender[i].transform.
item.meshRenderer = meshR
using UnityE
public class GhostItem : MonoBehaviour
//持续时间
public float
//销毁时间
public float deleteT
public MeshRenderer meshR
void Update(){
float tempTime = deleteTime - Time.
if (tempTime &= <span style="color: #) {//到时间就销毁
GameObject.Destroy (this.gameObject);
} else if(meshRenderer.material){
float rate = tempTime///计算生命周期的比例
Color cal = meshRenderer.material.GetColor("_RimColor");
cal.a *=//设置透明通道
meshRenderer.material.SetColor("_RimColor", cal);
这篇就写完啦,这种实现方式的优点就是残影可以实时捕捉动作,比较动态。缺点是比较消耗性能,频繁创建网格,相当于要多渲染那么多个人物。
如果有好的的优化思路,欢迎在下面评论
阅读(...) 评论()【Unity Shader】一个用于手游的次世代角色Shader
& & & & 在当今世代,手游都追求高画质,也有不少手游能&#36924;近主机效果(前提是手机跑得动)。然而要达到这么犀利的效果是要付出代价的,不得不通过各种优化或奇葩的手段(然而最重要是结果)。往往Unity自带的Shader并不能满足美术大大们的需求,所以作为一只逻辑程序猿不得不放下手头工作开始琢磨Shader,以满足需求。如果没有接触过计算机图形学的程序猿要学习Shader是必定痛苦万分的,庆幸的是在大学时期学习过DirectX(然而现在不记得怎么用了)。作为一只从来没接触过Shader的程序猿,看到Unity的ShaderLab,感觉一脸茫然,只好在翻谷歌,爬帖子和看书籍的日子中渡过。坚持了一段时间后,终于有所成就,能独立完成一些美术效果要求,开始不断研究不同的效果和实现方式。最后根据美术大大们的要求,重复实践,终于能出来个基本效果,在手机上性能也能过得去(松了一口气)。
& & & &&需要的效果:
一个次世代角色材质往往需要不少效果,但往往会有这几种:法线,高光,自发光还会有一些:半透,遮罩颜色,流光,轮廓光
& & & &&需要的节点:
颜色贴图:RGB通道用于颜色&#20540;,A通道用于透明&#20540;来自混合贴图:R通道用于高光蒙板,G通道用于自发光蒙板,B通道用于颜色遮罩蒙板法线贴图:自然是切线空间下的法线贴图流光贴图:以Addtive的方式叠加一层贴图,读取模型的UV2做滚动透明&#20540;:控制角色渐隐的浮点范围&#20540;(0-1)高光颜色:用于控制高光颜色,黑色下表示没有高光高光强度:用于控制高光强度(倍数)高光范围:用于控制高光范围(次幂)自发光强度:用于控制自发光强度轮廓光颜色:用于控制轮廓光颜色,黑色下表示没有轮廓光轮廓光强度:用于控制轮廓光强度(次幂)
法线:在Unity中非常多案例,一般是在切线空间下做处理,主要用于跟光向做点积高光:用法线贴图在切线空间内跟光向和视向的半角向量做点积自发光:根据蒙板信息,叠加基本颜色半透:由于是角色,不能关闭深度测试,所以要用AlphaTest来做半透处理,并且渲染队列放到Geometry后面遮罩颜色:根据蒙板信息,使用遮罩颜色替换基本颜色流光:在自发光处理中合并处理,根据时间滚UV,叠加流光贴图的颜色轮廓光:在光照计算里加入一道法线和光向的点积计算
Surface ShaderShader &Yogi/Character&
Properties
_MainTex(&Base(RGB) Trans(A)&, 2D) = &white& {}
_BlendMap(&Gloss(R) Illum(G) Mask(B)&, 2D) = &black& {}
_BumpMap(&Normalmap&, 2D) = &bump& {}
_FlowMap(&Flowmap&, 2D) = &black& {}
_MaskColor(&Mask Color&, Color) = (1, 1, 1, 1)
_Alpha(&Alpha&, Range(0, 1)) = 1
_Specular(&Specular&, Range(0, 10)) = 1
_Shininess(&Shininess&, Range(0.01, 1)) = 0.5
_Emission(&Emission&, Range(0, 10)) = 1
_FlowSpeed(&Flow Speed&, Range(0, 10)) = 1
_RimColor(&Rim Color&, Color) = (0, 0, 0, 1)
_RimPower(&Rim Power&, Range(0, 10)) = 1
&Queue& = &Geometry+1&
&RenderType& = &Opaque&
&IgnoreProjector& = &True&
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater 0.1
#pragma surface surf CustomBlinnPhong nolightmap
sampler2D _MainT
sampler2D _BlendM
sampler2D _FlowM
sampler2D _BumpM
fixed3 _MaskC
fixed3 _RimC
fixed _FlowS
fixed _RimP
struct Input
fixed2 uv_MainT
fixed2 uv2_FlowM
inline fixed4 LightingCustomBlinnPhong(SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten)
fixed3 h = normalize(lightDir + viewDir);
fixed diff = saturate(dot(s.Normal, lightDir));
fixed nh = saturate(dot(s.Normal, h));
fixed spec = pow(nh, s.Specular * 128.0) * s.G
fixed nv = pow(1 - saturate(dot(s.Normal, viewDir)), _RimPower);
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
c.rgb += nv * _RimC
c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec *
void surf(Input IN, inout SurfaceOutput o)
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
fixed3 b = tex2D(_BlendMap, IN.uv_MainTex);
fixed3 f = tex2D(_FlowMap, IN.uv2_FlowMap + _Time.xx * _FlowSpeed);
c.rgb = lerp(c.rgb, _MaskColor.rgb, b.b);
o.Albedo = c.
o.Alpha = c.a * _A
o.Gloss = b.r * _S
o.Specular = _S
o.Emission = c.rgb * b.g * _Emission +
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
FallBack &Mobile/Diffuse&
Vert&Frag ShaderShader &Yogi/Character&
Properties
_MainTex(&Base(RGB) Trans(A)&, 2D) = &white& {}
_BlendMap(&Gloss(R) Illum(G) Mask(B)&, 2D) = &black& {}
_BumpMap(&Normalmap&, 2D) = &bump& {}
_FlowMap(&Flowmap&, 2D) = &black& {}
_MaskColor(&Mask Color&, Color) = (1, 1, 1, 1)
_Alpha(&Alpha&, Range(0, 1)) = 1
_Specular(&Specular&, Range(0, 10)) = 1
_Shininess(&Shininess&, Range(0.01, 1)) = 0.5
_Emission(&Emission&, Range(0, 10)) = 1
_FlowSpeed(&Flow Speed&, Range(0, 10)) = 1
_RimColor(&Rim Color&, Color) = (0, 0, 0, 1)
_RimPower(&Rim Power&, Range(0, 10)) = 1
&Queue& = &Geometry+1&
&RenderType& = &Opaque&
&IgnoreProjector& = &True&
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater 0
#include &UnityCG.cginc&
#include &Lighting.cginc&
#include &AutoLight.cginc&
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_fwdbase nolightmap nodirlightmap
sampler2D _MainT
sampler2D _BlendM
sampler2D _FlowM
sampler2D _BumpM
fixed4 _MainTex_ST;
fixed3 _MaskC
fixed3 _RimC
fixed _FlowS
fixed _RimP
struct a2v
fixed4 vertex : POSITION;
fixed3 normal : NORMAL;
fixed4 tangent : TANGENT;
fixed4 texcoord : TEXCOORD0;
fixed4 texcoord1 : TEXCOORD1;
struct v2f
fixed4 pos : SV_POSITION;
fixed4 uv : TEXCOORD0;
fixed3 lightDir : TEXCOORD1;
fixed3 vlight : TEXCOORD2;
fixed3 viewDir : TEXCOORD3;
LIGHTING_COORDS(4,5)
v2f vert(a2v v)
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = v.texcoord1.
TANGENT_SPACE_ROTATION;
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex));
#ifdef LIGHTMAP_OFF
fixed3 worldNormal = mul((fixed3x3)_Object2World, SCALED_NORMAL);
o.vlight = ShadeSH9(fixed4(worldNormal, 1.0));
#ifdef VERTEXLIGHT_ON
fixed3 worldPos = mul(_Object2World, v.vertex).
o.vlight += Shade4PointLights(
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
unity_4LightAtten0, worldPos, worldNormal);
TRANSFER_VERTEX_TO_FRAGMENT(o);
fixed4 frag(v2f i) : SV_Target
fixed4 c = tex2D(_MainTex, i.uv.xy);
fixed3 b = tex2D(_BlendMap, i.uv.xy);
fixed3 f = tex2D(_FlowMap, i.uv.zw + _Time.xx * _FlowSpeed);
fixed3 n = UnpackNormal(tex2D(_BumpMap, i.uv.xy));
fixed atten = LIGHT_ATTENUATION(i);
fixed3 h = normalize(i.lightDir + i.viewDir);
fixed diff = saturate(dot(n, i.lightDir));
fixed nh = saturate(dot(n, h));
fixed spec = pow(nh, _Shininess * 128.0) * b.r * _S
fixed nv = pow(1 - saturate(dot(n, i.viewDir)), _RimPower);
fixed4 o = 0;
c.rgb = lerp(c.rgb, _MaskColor.rgb, b.b);
o.rgb = (c.rgb * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
o.rgb += nv * _RimC
o.rgb += c.rgb * i.
o.rgb += c.rgb * b.g * _Emission +
o.a = c.a * _A
FallBack &Mobile/Diffuse&
& & & & 效果最后肯定不能这样直接呈现给玩家看的(乱七八糟的),所以有些效果才做了开关和设置节点,需要利用代码去控制。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?这是一个用来制作shader的插件,也是一个很好的学习shader的工具。这个插件上手很容易,但是要用它来制作理想的Shader,需要下点功夫。
这儿先列举出基础知识,以及我的一些实践。以后我还会继续学习并记录更多的内容。
一、基本操作:  
  1)、截断连线:按住alt并右键   2)、框选:按住alt键并框选   3)、对于不认识的节点,右键选择what,出现API官网,可选简体字
二、开始设置:  
  1)、新建材质要命名并设置好路径
  2)、考虑shader可能会运行的平台或显卡配置
  3)、渲染路径:向前渲染或延迟渲染,后者能避免重复渲染,提高渲染效率,但不能实现抗锯齿和混合技术
  4)、光照模式:自定义光照等
  5)、镜面反射模式:镜面或金属
  6)、光泽模式:光泽或粗糙
  7)、Geometry-&Face Culling:背面切除或正面切除或双面渲染
  8)、Blend Mode:混合模式
三、Main输出端:&
  1)、Diffuse Power:漫反射力道,相当耗能
  2)、Metallic:金属质感,值越大时漫反射越小
  3)、Gloss:光泽,值越高光泽度越高,1为极值,物极必反
  4)、Emisson:自发光
  5)、Transmission:透射,决定有多少光线可以透过材质
  6)、Light Wrapping:环绕光,让光线或某个通道的值环绕对象,可做出皮肤的效果
  7)、Diffuse Ambient Light:漫反射环境光,添加光线或环境光或立体贴图,不用自发光或光源,也能显亮
  8)、Specular Ambient Light:镜面反射环境光,可映出环境的贴图???
  9)、Diffuse Ambient Occlusion:漫反射环境光遮罩,抑制间接漫反射光线
  10)、Specular Ambient Occlusion:镜面反射环境光遮罩,抑制间接镜面反射光线
  11)、Custom Lighting:自定义照明,被光照射时,自定义照射效果
  12)、Opacity:不透明度,控制最终像素的透明度
  13)、Opacity Clip:不透明度剪切,根据阿尔法通道剪切不透明区域
  14)、Refraction:反射,用于折射背景像素的屏幕空间 UV 偏移。请确保在使用前将 Opacity(不透明度)设置为低于 1 的值,以便折射效果可见
  15)、Outline Width:描边宽度
  16)、Vertex Offset:顶点偏移,插入每个顶点所需偏移量的 XYZ 坐标
  17)、DX11 Displacement:DX11 位移,此选项和 Vertex Offset(顶点偏移)的作用非常类似,但是与 DX11 曲面细分一起使用。(请注意,DirectX 仅适用于 Windows,需要 DX11 GPU 且必须在 Unity 设置中启用)
  18)、DX11 Tessellation:DX11 曲面细分,此选项控制您要将三角形分割为多少个细分。(请注意,DirectX 仅适用于 Windows,需要 DX11 GPU 且必须在 Unity 设置中启用)
四、部分节点:  
  1)、加减乘除:Add、Subtract、Multiply、Divide
  2)、乘方、平方根、对数:Power、Sqrt、Log
  3)、绝对值:Abs
  4)、Sign:取正负号及0
  5)、Ceil:进位取整,输出时将其输入向上舍入为最近整数
  6)、Round:四舍五入
  7)、Floor:舍位取整,输出时将其输入向下舍入为最近整数
  8)、Trunc:去零取整
  9)、Step:比较,输出0或1,用来区分出每一层的明暗,输出的是黑白纹理
  10)、If:条件
  11)、Frac:取小数部分,此节点在与 Time(时间)节点一起使用时非常有用,会随时间变化带来锯齿波
  12)、Fmod:取模,输出 [A] 除以 [B] 的余数
  13)、Clamp:限定范围
  14)、Lerp:插值,如果 [T] 为两者间的任一值,则将输入两者的线性混合
  15)、Posterize:色调分离,基于经过 [Steps] 的值对值进行四舍五入取整。[Steps] 值为 5 时将在 0 到 1 的范围内创建 5 段
  16)、Blend:混合,有不同的混合方式,用时查看API
  17)、Remap:重映射,将值从一个范围重映射到另一个范围,用来加深或减弱
  18)、Noise:噪音,根据两分量输入(例如 UV 坐标)生成伪随机点
  19)、One Minus:1 减,输出 1 减去其输入。与颜色输入一起使用时,将反转颜色
  20)、Negate:取反,输出其主输入乘以 -1。实质上让正值变负,让负值变正
  21)、Component Mask :分量遮罩,遮罩某个通道
  22)、Channel Blend :通道混合
  23)、Fresnel:菲涅耳,边缘亮显的效果
五、实例:
  1.自定义光照:
阅读(...) 评论()使用Shader实现高亮效果 | Unity3D教程手册
当前位置 :
>> 使用Shader实现高亮效果
使用Shader实现高亮效果
Shader &Rim&
Properties
_Color &#40;&Main Color&, Color&#41; = &#40;1,1,1,1&#41;
_SpecColor &#40;&Specular Color&, Color&#41; = &#40;0.5, 0.5, 0.5, 1&#41;
_Shininess &#40;&Shininess&, Range &#40;0.01, 1&#41;&#41; = 0.078125
_MainTex &#40;&Base (RGB) Gloss (A)&, 2D&#41; = &white& &#123;&#125;
_Illum &#40;&Illumin (A)&, 2D&#41; = &white& &#123;&#125;
_BumpMap &#40;&Normalmap&, 2D&#41; = &bump& &#123;&#125;
_EmissionLM &#40;&Emission (Lightmapper)&, Float&#41; = 0
_RimColor &#40;&Rim Color&, Color&#41; = &#40;0.26,0.19,0.16,0.0&#41;
_RimPower &#40;&Rim Power&, Range&#40;0.5,8.0&#41;&#41; = 3.0
Unity3D教程手册:www.unitymanual.com16&17
Tags &#123; &RenderType&=&Opaque& &#125;
#pragma surface surf BlinnPhong
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Illum;
fixed4 _Color;
half _Shininess;
float4 _RimColor;
float _RimPower;
struct Input
float2 uv_MainTex;
float2 uv_Illum;
float2 uv_BumpMap;
float3 viewDir;
void surf &#40;Input IN, inout SurfaceOutput o&#41;
Unity3D教程手册:www.unitymanual.com43
fixed4 tex = tex2D&#40;_MainTex, IN.uv_MainTex&#41;;
fixed4 c = tex * _Color;
o.Albedo = c.rgb;
o.Gloss = tex.a;
o.Alpha = c.a;
o.Specular = _Shininess;
o.Normal = UnpackNormal&#40;tex2D&#40;_BumpMap, IN.uv_BumpMap&#41;&#41;;
half rim = 1.0 - saturate&#40;dot&#40;normalize&#40;IN.viewDir&#41;, o.Normal&#41;&#41;;
o.Emission = c.rgb * tex2D&#40;_Illum, IN.uv_Illum&#41;.a + _RimColor.rgb * pow &#40;rim, _RimPower&#41;;
FallBack &Self-Illumin/Bumped Specular&
&#125; 58&59
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣![shader基础]利用shader和脚本实现渐变图片
精华热门加亮
今天在群里有一个同学问,如何实现颜色渐变图片的效果,本身知道frament shader可以做这件事情,但是没有实现过。忙活了好一会,终于写成功了,写了一下传上来亮个相。非常的欢迎批评指正。&效果:&& & & & & & & & & & & & & & & 726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('/forum/attachment/Mon__aaa9b1b3be6b469.jpg');" />&脚本: & & & & & & & & & & & & &726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('/forum/attachment/Mon__8ff164cae2b0a66.png');" />&&基本原理,在脚本中通过给四个vertex设定颜色,利用shader的缺省插值计算每个像素的颜色,非常基础的vertex frament shader,也非常适宜理解vertex shader和frament shader的工作方式,入门成功!&另外,mesh.colors这个数组无法单独赋值,如果想改变某个vertex的颜色,需要先声明一个与mesh顶点数同样大小的Color数组,修改这个数组,再把这个数组赋给Mesh.colors。C#是这样,其他的不知道。这个有点像在C#中,transform.position无法单独修改xyz值。但是单独修改mesh.colors,unity不会报错。只会假装给你改了实际上没改。以上是刚才忙活半天的成果,如果我说的不对一定要告诉我啊。&另外向各位shader学者问个事,写shaderlab,一般都用什么IDE,没有纠错太麻烦了。还有,unityCG.cginc里的详细内容文档哪里能找到呀?&工程下载:&&&&&&&&
要评论请先&或者&
支持原创 顶个 下载来看看
顶起,有段时间没看shader了
用什么IDE都一样,CG的东西是并行运算,没有Debug功能也很难提供unityCG.cginc在unity安装目录底下,你search一下不就知道了。。
:用什么IDE都一样,CG的东西是并行运算,没有Debug功能也很难提供unityCG.cginc在unity安装目录底下,你search一下不就知道了。。 ( 22:26) unityCG.cginc文件用记事本打开能看到内部的实现,但是一些函数和变量的详细用法和意义没有说,比如说_Time,_SinTime什么的具体会返回什么数值都没说呀。那牛人们写shader一般都是记事本啦?
:unityCG.cginc文件用记事本打开能看到内部的实现,但是一些函数和变量的详细用法和意义没有说,比如说_Time,_SinTime什么的具体会返回什么数值都没说呀。....... ( 23:02) 用notepad也不至于。。一般我就用Mono啊没有debug 语法提示缩进什么还是有点用的内部那些东西 都属于暗黑内容 并不公开的 如果你要研究除了反编译和跟踪没有啥其他好办法了
谢谢分享!
& & 感谢分享~

我要回帖

更多关于 蓝鲸游戏在中国弱爆了 的文章

 

随机推荐