U3Dunity 次时代shaderr用什么?自带shader效果弱爆了

不能则学,不知则问,耻于问人,决无长进。
Unity&Shader案例篇—膨胀效果
首先,来看一下效果图,如图所示:
这个效果要使得摄像机的Clear Flags为Solid Color模式,如果为其他模式可能会看不到外部那一圈光环。
二、实现原理
1、Shader部分:将需要使用两个Pass块,两个Pass块里输出的颜色不同,并最终使用透明度混合得到最后输出的像素颜色。
●第一个Pass块:这个Pass块顶点和片段程序都比较简单,代码如下:
Tags{ "LightMode" = "ForwardBase" }
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 vertexPos : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, vertexPos);
float4 frag(void) : COLOR{
只需将模型的顶点和预设的颜色输出就可以了。
●第二个Pass块:这个pass块相对复杂一点,顶点程序主要的计算内容就是顶点的法线方向和相机观察方向的向量,这两个的点积就是膨胀的强度Strength。通过指数函数缩放对Strength和透明度opacity进行计算就会得到膨胀的效果。计算的代码部分为:
float3 normalDirectionT = normalize(normalDirection);
float3 viewDirectionT = normalize(viewDirection);
float strength = abs(dot(viewDirectionT, normalDirectionT));
float opacity = pow(strength, _Strength);
而片段程序也是简单的输出最终的颜色就可以,完整的代码如下:
Tags{"LightMode" = "ForwardBase"
"Queue" = "Transparent"
"RenderType" = "Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _GlowC
float _GlowR
struct vInput {
float4 vertex : POSITION;
float4 normal : NORMAL;
struct v2f {
float4 position : SV_POSITION;
float4 col:COLOR;
v2f vert(vInput i) {
float4x4 modelMatrix = _Object2W
float4x4 modelMatrixInverse = _World2O
float3 normalDirection = normalize(mul(i.normal, modelMatrixInverse)).
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix, i.vertex).xyz);
float4 pos = i.vertex + (i.normal * _GlowRange);
o.position = mul(UNITY_MATRIX_MVP, pos);
float3 normalDirectionT = normalize(normalDirection);
float3 viewDirectionT = normalize(viewDirection);
float strength = abs(dot(viewDirectionT, normalDirectionT));
float opacity = pow(strength, _Strength);
float4 col = float4(_GlowColor.xyz, opacity);
float4 frag(v2f i) : COLOR{
在第二个Pass块中使用到了ZWrite Off命令,也即关闭遮挡,模型所有的面和通道都会被渲染,如果使用了ZWrite On命令,你会发现好像并没有什么变化,还是可以正常运行得到前面的效果。这是因为,Cull命令,默认的是Cull Back,即提出背面,不渲染模型的背面。如果使用Cull Front命令,即不渲染模型的前面,渲染的是模型的背面,得到的效果图如图所示,当然最终的选择就看你想要实现什么样的效果吧。
完整的Shader代码:
Shader "CgInUnity/Glow"
Properties{
_Color("Object's Color", Color) = (0, 1, 0, 1)
_GlowColor("Glow's Color", Color) = (1, 0, 0, 0)
_Strength("Glow Strength", Range(5.0, 1.0)) = 2.0
_GlowRange("GlowRange",Range(0.1,1))=0.3
SubShader{
Tags{ "LightMode" = "ForwardBase" }
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 vertexPos : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, vertexPos);
float4 frag(void) : COLOR{
Tags{"LightMode" = "ForwardBase"
"Queue" = "Transparent"
"RenderType" = "Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _GlowC
float _GlowR
struct vInput {
float4 vertex : POSITION;
float4 normal : NORMAL;
struct v2f {
float4 position : SV_POSITION;
float4 col:COLOR;
v2f vert(vInput i) {
float4x4 modelMatrix = _Object2W
float4x4 modelMatrixInverse = _World2O
float3 normalDirection = normalize(mul(i.normal, modelMatrixInverse)).
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix, i.vertex).xyz);
float4 pos = i.vertex + (i.normal * _GlowRange);
o.position = mul(UNITY_MATRIX_MVP, pos);
float3 normalDirectionT = normalize(normalDirection);
float3 viewDirectionT = normalize(viewDirection);
float strength = abs(dot(viewDirectionT, normalDirectionT));
float opacity = pow(strength, _Strength);
float4 col = float4(_GlowColor.xyz, opacity);
float4 frag(v2f i) : COLOR{
2、控制脚本部分C#代码:
using UnityE
using System.C
public class GlowControl : MonoBehaviour {
private float value;
[SerializeField]
float speed=1;
void Start () {
mat = GetComponent&MeshRenderer&().sharedM
void Update () {
value = Mathf.PingPong(Time.time * speed, 5);
Debug.Log(value);
mat.SetFloat("_Strength", value);
就是一个简单控制强度随着时间变换的代码。
这个小小的案例我们学习到了怎么使用多个Pass块来渲染同一个物体,以及在多个Pass块中使用透明度混合。我个人认为是一个非常不错的学习案例,不只是因为
它的代码部分非常简洁明了,更重要的是这个案例在很多应用中也是非常有用的。祝好好学习,慢慢变牛。
每天进步一点点。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Unity3D中人物角色被攻击变色,死亡渐隐消失,墙后显示的Shader - 简书
Unity3D中人物角色被攻击变色,死亡渐隐消失,墙后显示的Shader
这段代码是在Unity蛮牛给人解答的时候写的,第一次写Shader,Unity官方的语法还没来得及完全过一遍,比较仓促,还好效果实现了!
笔记:Alpha Blending则是一种中庸的方式,它使用当前fragment的alpha作为混合因子,来混合之前写入到缓存中颜色值。但Alpha Blending麻烦的一点就是它需要关闭ZWrite,并且要十分小心物体的渲染顺序。如果不关闭ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite。
Shader "Custom/Test" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_Alpha("Alpha", Range (0.01,1.0)) = 0.5
SubShader {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
ZWrite Off
ColorMask 0
#pragma surface surf Lambert alpha
sampler2D _MainT
struct Input {
float2 uv_MainT
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex) * _C
o.Emission = c.
o.Alpha = _A
FallBack "Diffuse"}
将上面的这段Shader放到Unity3D中,放到模型上。就可以自己调试Alpha值和模型的颜色了,只要在角色被攻击的时候改下颜色值,然后攻击完改回来就可以了,角色死亡的时候调整Alpha值减少,就可以看起来是渐隐消失的效果了!
由于透明度在不同的移动端优化和ColorMask这玩意在移动端消耗比较大,所以有了下面的这个shader:
Shader "Transparent/DiffuseS" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
#pragma surface surf Lambert alpha
sampler2D _MainT
struct Input {
float2 uv_MainT
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _C
o.Emission = c.
o.Alpha = c.a;
Fallback "Transparent/VertexLit"
这个shader可以在移动端使用没有问题,修改的时候只要修改_Color属性和颜色值即可!
转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色...
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(...
Basic Shaderlab unity 使用一个叫做 shaderlab 的语言用来包装和组织整个shader结构,我们要为 unity 定制 shader ,也需要书写在 shaderlab 结构之中。shaderlab 结构形如: 其中 shader &name& ...
111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画-&点缓存-&关键帧 112. [动画]Unity引擎Mecanim动画系统功能优点? 答: l 简单化对类人角色动画设计与功能实现的工作流程。 l Mecanim动画系统使用一个可视化编程工具来管理动画之间...
【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质 Babybus-u3d技术交流-【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质文章链接:[[h...
--小楼依旧当年貌,世间已无程蝶衣 戏如人生,人生如戏。霸王与虞姬,段小楼与程蝶衣。年少的依恋,便注定了他们这一世的纠缠。 每个人都有痴痴爱着的霸王,你爱的明烈,可他不懂。女子的直觉,菊仙在与蝶衣的初见就觉察出了他们的不寻常。她患得患失,为了救小楼,欺骗蝶衣。蝶衣为救小楼,...
首先,我承认,我是一个特别敏感的人。但敏感就不好吗?任何事情都有两面,所以关键是我们怎样去看。 据统计敏感人群占总人数的20%,而这些敏感的人当中有80%都出生在一个“不敏感”的家庭中,也是说,这家只有孩子敏感,而家长并不敏感。 敏感,是因为他们生来就对于环境中细节捕捉敏锐...
文/Sunny笙笳 永远年轻,永远热泪盈眶。 这句话是在一个姐姐朋友圈看到的,那天是她25岁生日。她发了这一年里去做志愿者、看演唱会的一些照片,最后的一张图是一群朋友为她庆生,照片里的她扎着丸子头,笑的那样动人,好看的一塌糊涂。 当时很有触动在日记本里记下了这句话,希望自己...
最近需要在 react 代码中插入一个文本编辑器,然后看了一下tinymce这个库。 导入库 在npm中搜索相关的库,然后发现有直接包装好的react-tinymce库,但是在引用过程中会出现 “Unknown prop config on &tinymce& tag” 的...
你的点赞???是我前进最大的动力。 慢慢积累,在练设计手绘的同时,用剩余时间在手绘本上画自己喜欢的东西,慢慢感受自己的进步,在未来翻约会别有一番感觉... 我会坚持每天手绘!每天和大家交流。 你的点赞?????是我前进最大的动力!别客气,点一下吧!???...//Shader代码
Shader "Hidden/Mosaic"
Properties
_MainTex ("Texture", 2D) = "white" {}
_TileSize("Tile Size", Range(<span style="color: #.001,<span style="color: #)) = <span style="color: #.05
// No culling or depth
Cull Off ZWrite Off ZTest Always
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
v2f vert (appdata v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
sampler2D _MainT
fixed _TileS
fixed4 frag (v2f i) : SV_Target
i.uv.x = ceil(i.uv.x/_TileSize)*_TileS
i.uv.y = ceil(i.uv.y/_TileSize)*_TileS
fixed4 col = tex2D(_MainTex, i.uv);
阅读(...) 评论()Keep Reading , Keep Writing , Keep Coding.
【Unity Shader编程】之十六 基于MatCap实现适于移动平台的“次时代”车漆Shader
本系列文章由 出品,转载请注明出处。
文章链接: 渲染本文配图使用的Unity3D版本: 5.5.0这篇文章将基于MatCap的思想,在Unity中实现了具有高度真实感的MatCap车漆Shader。采用MatCap思想的Shader,用低廉的计算成本,就可以达到类似PBS非常真实的渲染效果,可谓是在移动平台实现次时代渲染效果的一种优秀解决方案。本文以车漆Shader为例,但MatCap思想能实现的,并不局限于车漆Shader。本来准备给本文取名《一种基于MatCap的低计算成本、高真实感移动平台Shader解决方案》的,但这个名字太大了,遂改之。先看一下最终的效果图。
一、MatCap概述Material Capture(材质捕获),通常被简称为MatCap,在Zbrush、Sculptris、Mudbox等3D软件中有比较多的使用。MatCap Shader的基本思路是,使用某特定材质球的贴图,作为当前材质的视图空间环境贴图(view-space environment map),来实现具有均匀表面着色的反射材质物体的显示。考虑到物体的所有法线的投影的范围在x(-1,1),y(-1,1),构成了一个圆形,所以MatCap 贴图中存储光照信息的区域是一个圆形。基于MatCap思想的Shader,可以无需提供任何光照,只需提供一张或多张合适的MatCap贴图作为光照结果的“指导”即可。上图来自()不像一般的Shader,需要提供光照,需要在Shader代码中进行漫长的演算,基于MatCap思想的Shader相当于MatCap贴图就把光照结果应该是怎样的标准答案告知Shader,我们只用在试卷下写出答案,进行一些加工即可。需要注意,MatCap Shader有一定的局限性。因为从某种意义上来说,基于MatCap的Shader,就是某种固定光照条件下,从某个特定方向,特定角度的光照表现结果。正是因为是选择的固定的MatCap贴图,得到相对固定的整体光照表现,若单单仅使用MatCap,就仅适用于摄像机不调整角度的情形,并不适合摄像机会频繁旋转,调节角度的情形。但我们可以在某些Shader中,用MatCap配合与光照交互的其他属性,如将MatCap结合一个作为光照反射的颜色指导的Reflection Cube Map,就有了与光照之间的交互表现。这样,就可以适当弥补MatCap太过单一整体光照表现的短板。关于MatCap,《UnityShaders and Effects Cookbook》一书的Chapter 5: LightingModels中,The Lit Sphere lighting model一节也有一些涉及。二、MatCap贴图的获取 需要使用基于MatCap Shader,合适的MatCap 贴图必不可少。显而易见,MatCap贴图的获取,一般来说有两种方式。1. 自己制作。对着3D软件中的材质球截图。2. 从网络上获取。在网络上使用“matcap“等关键字搜索后获得。这边提供几个可以获取MatCap贴图的网址:[1] [2][3] 三、基于MatCap实现Physically Based Shading的思路简析 关于基于MatCap思想实现Physicallybased Shading,这篇文章()提供了一定的思路,简单来说,就是用几张MatCap贴图来提供PBS需要的光滑度和金属度,来模拟出PBS的效果。继续展开下去就脱离本文的主线了,有兴趣的朋友可以深入进行了解。 四、基于MatCap思想的车漆Shader实现 此车漆Shader,除了用到MatCap,主要还需要提供一个Reflection Cube Map作为反射的颜色指导,就可以适当弥补MatCap太过单一的整体光照表现的短板,实现非常真实且高效的车漆Shader效果。此Shader赋给Material后,Material在Inspector中的属性表现如下:其中的MatCap贴图为: Shader源码如下:Shader "ShaderPrac/Car Paint Shader"
Properties
_MainColor("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)
//细节颜色
_DetailColor("Detail Color", Color) = (1.0, 1.0, 1.0, 1.0)
//细节纹理
_DetailTex("Detail Textrue", 2D) = "white" {}
//细节纹理深度偏移
_DetailTexDepthOffset("Detail Textrue Depth Offset", Float) = 1.0
//漫反射颜色
_DiffuseColor("Diffuse Color", Color) = (0.0, 0.0, 0.0, 0.0)
//漫反射纹理
_DiffuseTex("Diffuse Textrue", 2D) = "white" {}
//Material Capture纹理
_MatCap("MatCap", 2D) = "white" {}
//反射颜色
_ReflectionColor("Reflection Color", Color) = (0.2, 0.2, 0.2, 1.0)
//反射立方体贴图
_ReflectionMap("Reflection Cube Map", Cube) = "" {}
//反射强度
_ReflectionStrength("Reflection Strength", Range(0.0, 1.0)) = 0.5
"Queue" = "Geometry"
"RenderType" = "Opaque"
#include "UnityCG.cginc"
#pragma fragment frag
#pragma vertex vert
float4 _MainC
float4 _DetailC
sampler2D _DetailT
float4 _DetailTex_ST;
float _DetailTexDepthO
float4 _DiffuseC
sampler2D _DiffuseT
float4 _DiffuseTex_ST;
sampler2D _MatC
float4 _ReflectionC
samplerCUBE _ReflectionM
float _ReflectionS
//顶点输入结构
struct VertexInput
float3 normal : NORMAL;
float4 position : POSITION;
float2 UVCoordsChannel1: TEXCOORD0;
//顶点输出(片元输入)结构
struct VertexToFragment
float3 detailUVCoordsAndDepth : TEXCOORD0;
float4 diffuseUVAndMatCapCoords : TEXCOORD1;
float4 position : SV_POSITION;
float3 worldSpaceReflectionVector : TEXCOORD2;
//------------------------------------------------------------
// 顶点着色器
//------------------------------------------------------------
VertexToFragment vert(VertexInput input)
//漫反射UV坐标准备:存储于TEXCOORD1的前两个坐标xy。
output.diffuseUVAndMatCapCoords.xy = TRANSFORM_TEX(input.UVCoordsChannel1, _DiffuseTex);
//MatCap坐标准备:将法线从模型空间转换到观察空间,存储于TEXCOORD1的后两个纹理坐标zw
output.diffuseUVAndMatCapCoords.z = dot(normalize(UNITY_MATRIX_IT_MV[0].xyz), normalize(input.normal));
output.diffuseUVAndMatCapCoords.w = dot(normalize(UNITY_MATRIX_IT_MV[1].xyz), normalize(input.normal));
//归一化的法线值区间[-1,1]转换到适用于纹理的区间[0,1]
output.diffuseUVAndMatCapCoords.zw = output.diffuseUVAndMatCapCoords.zw * 0.5 + 0.5;
//坐标变换
output.position = mul(UNITY_MATRIX_MVP, input.position);
//细节纹理准备准备UV,存储于TEXCOORD0的前两个坐标xy
output.detailUVCoordsAndDepth.xy = TRANSFORM_TEX(input.UVCoordsChannel1, _DetailTex);
//深度信息准备,存储于TEXCOORD0的第三个坐标z
output.detailUVCoordsAndDepth.z = output.position.z;
//世界空间位置
float3 worldSpacePosition = mul(unity_ObjectToWorld, input.position).
//世界空间法线
float3 worldSpaceNormal = normalize(mul((float3x3)unity_ObjectToWorld, input.normal));
//世界空间反射向量
output.worldSpaceReflectionVector = reflect(worldSpacePosition - _WorldSpaceCameraPos.xyz, worldSpaceNormal);
//------------------------------------------------------------
// 片元着色器
//------------------------------------------------------------
float4 frag(VertexToFragment input) : COLOR
//镜面反射颜色
float3 reflectionColor = texCUBE(_ReflectionMap, input.worldSpaceReflectionVector).rgb * _ReflectionColor.
//漫反射颜色
float4 diffuseColor = tex2D(_DiffuseTex, input.diffuseUVAndMatCapCoords.xy) * _DiffuseC
float3 mainColor = lerp(lerp(_MainColor.rgb, diffuseColor.rgb, diffuseColor.a), reflectionColor, _ReflectionStrength);
//细节纹理
float3 detailMask = tex2D(_DetailTex, input.detailUVCoordsAndDepth.xy).
//细节颜色
float3 detailColor = lerp(_DetailColor.rgb, mainColor, detailMask);
//细节颜色和主颜色进行插值,成为新的主颜色
mainColor = lerp(detailColor, mainColor, saturate(input.detailUVCoordsAndDepth.z * _DetailTexDepthOffset));
//从提供的MatCap纹理中,提取出对应光照信息
float3 matCapColor = tex2D(_MatCap, input.diffuseUVAndMatCapCoords.zw).
//最终颜色
float4 finalColor=float4(mainColor * matCapColor * 2.0, _MainColor.a);
return finalC
Fallback "VertexLit"
}Shader注释已经比较详细,下面对代码中也许会不太理解,需要注意的地方进行说明。要使用MatCap贴图,主要是将法线从模型空间转换到视图空间,并切换到适合提取纹理UV的区域[0,1]。(需要将法线从模型空间转换到视图空间,关于一些推导可以参考或者)Unity内置的矩阵UNITY_MATRIX_IT_MV,是UNITY_MATRIX_MV的逆转置矩阵,其作用正是将法线从模型空间转换到观察空间。于是顶点着色器vert中的这两句代码就很容易理解了://MatCap坐标准备:将法线从模型空间转换到观察空间,存储于TEXCOORD1的后两个纹理坐标zw
output.diffuseUVAndMatCapCoords.z =dot(normalize(UNITY_MATRIX_IT_MV[0].xyz), normalize(input.normal));
output.diffuseUVAndMatCapCoords.w= dot(normalize(UNITY_MATRIX_IT_MV[1].xyz), normalize(input.normal));而得到的视图空间的法线,区域是[-1,1],要转换到提取纹理UV的区域[0,1],就需要乘以0.5并加上0.5,那么顶点着色器vert中接下来的的这句代码也就可以理解了: //归一化的法线值区间[-1,1]转换到适用于纹理的区间[0,1]
output.diffuseUVAndMatCapCoords.zw= output.diffuseUVAndMatCapCoords.zw * 0.5 + 0.5;稍后,在片元着色器frag中,用在顶点着色器vert中准备好的法线转换成的UV值,提取出MatCap的光照细节即可://从提供的MatCap纹理中,提取出对应光照信息
float3matCapColor = tex2D(_MatCap, input.diffuseUVAndMatCapCoords.zw).此Car Paint Shader其他实现,主要就是一些基本的Shader知识点的配合,如顶点坐标转换,反射,漫反射,细节纹理的计算,都是比较基础的内容,这里就不再赘述,直接看Shader源码即可。最后看几张截图,然后就是相关Shader与MatCap资源的下载: 五、Shader源码与MatCap资源下载从Github下载:
参考与延伸 [1] [2] [3] [4] [5] [6] [7] http://digitalrune.github.io/DigitalRune-Documentation/html/9a8c8b37-b996-477a-aeab-5d92714be3ca.htm[8] [9]With Best Wishes.
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Shader实例,溶解&燃烧效果【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:87,424贴子:
Shader实例,溶解&燃烧效果收藏
游戏中物体腐化消失,燃烧消失时,会有从局部慢慢消失的效果,然后配合一些粒子特效,就能达到非常好的美术效果。类似效果如下:注:_DissColor为溶解主色,_AddColor为叠加色,按照溶解的移动方向来看开始色为DissColor+AddColor上图中DissColor为红色,AddColor为绿色所以燃烧时开始色为DissColor + AddColor = 黄色默认色为DissColor 红色然后配上火的粒子特效,这样就能模拟比较真实的燃烧效果。我们也可以设置其他的颜色,比如被各种魔法,化学物品击中.....算了,不敢想象了,好残忍 代码和原理如下:Shader &Dissolve/Dissolve_TexturCoords& {
Properties {
_Color (&主颜色&, Color) = (1,1,1,1)
_MainTex (&模型贴图&, 2D) = &white& {}
_DissolveText (&溶解贴图&, 2D) = &white& {}
// 溶解贴图
_Tile(&溶解贴图的平铺大小&, Range (0, 1)) = 1
// 平铺值,设置溶解贴图大小
_Amount (&溶解值&, Range (0, 1)) = 0.5
_DissSize(&溶解大小&, Range (0, 1)) = 0.1
// 溶解范围大小
_DissColor (&溶解主色&, Color) = (1,1,1,1)
// 溶解颜色
_AddColor (&叠加色,与主色叠加为开始色[R|G|B&0表示启用]&, Color) = (1,1,1,1) // 改色与溶解色融合形成开始色
SubShader {
Tags { &RenderType&=&Opaque& }
#pragma target 3.0
#pragma surface surf BlinnPhong
sampler2D _MainT
sampler2D _DissolveT
half _DissS
// 溶解范围
half4 _DissC
// 溶解颜色
half4 _AddC
static half3 finalColor = float3(1,1,1);
struct Input {
float2 uv_MainT
// 只需要主材质的UV信息
void surf (Input IN, inout SurfaceOutput o) {
// 对主材质进行采样
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
// 设置主材质和颜色
o.Albedo = tex.rgb * _Color.
// 对裁剪材质进行采样,取R色值
float ClipTex = tex2D (_DissolveText, IN.uv_MainTex/_Tile).r;
// 裁剪量 = 裁剪材质R - 外部设置量
float ClipAmount = ClipTex - _A
if(_Amount & 0)
// 如果裁剪材质的R色值 & 设置的裁剪值
那么此点将被裁剪
if(ClipAmount & 0)
clip(-0.1);
// 然后处理没有被裁剪的值
// 针对没有被裁剪的点,【裁剪量】小于【裁剪大小】的做处理
// 如果设置了叠加色,那么该色为ClipAmount/_DissSize(这样会形成渐变效果)
if(ClipAmount & _DissSize)
if(_AddColor.x == 0)
finalColor.x = _DissColor.x;
finalColor.x = ClipAmount/_DissS
if (_AddColor.y == 0)
finalColor.y = _DissColor.y;
finalColor.y = ClipAmount/_DissS
if (_AddColor.z == 0)
finalColor.z = _DissColor.z;
finalColor.z = ClipAmount/_DissS
= o.Albedo * finalColor * 2;
o.Alpha = tex.a * _Color.a;
}//endsubshader
免费试用_UNIGINE是俄罗斯一款应用于虚拟仿真,虚拟现实,视觉化领域的实时3D引擎.主要优势:特大真实地形场景,照片级实时渲染,多样输出支持.&&免费试用进行中
其实楼主还有一个博客 写的也是蛮吊的。想学习shader的可以自行百度一下。
顶一下楼主大大
刚刚测试过 效果非常炫酷 但是好像不支持alpha值 所以我在 Cull off 上面 加了一行 Blend SrcAlpha OneMinusSrcAlpha 就可以啦~然后还有个小优化就是如果刚好减得的ClipAmount是0的话 texture上会残留好难看的黑色 所以我改了一下if(ClipAmount & 0) 这一行 加了一个等号 if(ClipAmount &= 0) 难看的黑色就搞定~
大神 请问下我模型的主贴图变成黑色的了 请问怎么办 啊
5.0自带gai
5.0自带选择cut加通道也可以调节类似效果。
51CTO学院12年行业品牌,1600万用户选择,中国专业IT技能学习平台,unity.通过在线学习的方式,帮助广大技术人员实现技能提升,高薪就业的职业梦想,unity.
那水沸腾效果怎么做呢?
怎么有的那种动态效果啊 shader写完挂到物体上嘛还是?
楼主,你这个中文用的真是好,这个操作给满分
登录百度帐号}

我要回帖

更多关于 相公你弱爆了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信