Unity小技巧 - 烧熔Shader

效果

原理

根据给定的噪声图,当噪声图中的R值小于指定的值,就舍弃当前的像素。

1. 噪声图

噪声在图形学内十分常见,可以认为是图形学里的随机数(这里我们不用真的随机数,是因为真的随机数太过“均匀”,形成的是白噪声,一点都不好用)。

2. 着色器

(注:完整代码在最后贴出。)

属性定义如下:

(1) Main Tex:物体的主要纹理贴图,决定了物体的主要外表

(2) Noise Tex:噪声贴图

(3) Min Alpha:最低的Alpha,当噪声贴图中的R值小于该值,则舍弃当前的像素

顶点着色器:只是传入位置和贴图坐标,十分简单,这里就不赘述了。

片元着色器

当噪声贴图小于最低的Alpha,舍弃当前像素

            float4 frag(v2f input) : SV_Target {                float4 mainColor = tex2D(_MainTex, input.texcoord); 
                float4 noiseColor = tex2D(_Noise, input.texcoord);
                float alpha = noiseColor - _MinAlpha;
                clip(alpha);

                return mainColor;
            }

上面只是实现了消失的效果,为了有火烧的效果,可以在消失的边缘处改用黄色。

            float4 frag(v2f input) : SV_Target {                float4 mainColor = tex2D(_MainTex, input.texcoord);
                float4 noiseColor = tex2D(_Noise, input.texcoord);
                float alpha = noiseColor - _MinAlpha;
                clip(alpha);

                if(alpha < 0.05)
                    return float4(1,0.5,0,0) * alpha / 0.05;
                else
                    return mainColor;
            }        

完整的Shader代码

Shader "Custom/Melt" {
    Properties {
        _MainTex("Main Tex", 2D) = "white" {}
        _Noise("Noise Tex", 2D) = "white" {}
        _MinAlpha("Min Alpha", Range(0, 1)) = 0.0
    }

    SubShader {
        Pass {
            CGPROGRAM 

            #pragma vertex vert
            #pragma fragment frag 

            #include "UnityCG.cginc"

            sampler2D _Noise;
            sampler2D _MainTex;
            float _MinAlpha;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 position : SV_POSITION;
                float2 texcoord : TEXCOORD1;
            };

            v2f vert(appdata input) {
                v2f o;
                o.position = mul(UNITY_MATRIX_MVP, input.vertex);
                o.texcoord = input.texcoord;
                return o;
            }

            float4 frag(v2f input) : SV_Target {
                float4 mainColor = tex2D(_MainTex, input.texcoord);
                float4 noiseColor = tex2D(_Noise, input.texcoord);
                float alpha = noiseColor.r - _MinAlpha;
                clip(alpha);
                if(alpha < 0.05)
                    return float4(1,0.5,0,0) * alpha / 0.05;
                else
                    return mainColor / 2;//除以2只是为了暗一点
            }

            ENDCG
        }
    }
}

总结

简单地利用噪声图进行透明度测试,就能实现烧熔的效果。

参考

http://gad.qq.com/program/translateview/7187984

http://gad.qq.com/article/detail/7190975

时间: 2024-11-10 06:50:11

Unity小技巧 - 烧熔Shader的相关文章

Unity3D使用小技巧

原地址:http://unity3d.9tech.cn/news/2014/0411/40178.html 1.Crtl+f摄像机自动适配场景. 2.可以用一个立方体作为底盘. 3.人物角色可以直接引入包,有第一人称和第三人称,已经封装好. 4.光源可以设置投影. 5.3DMax是Z轴向上,而一般游戏引擎是Y轴向上,所以导出的时候一定要注意选择YZ转化的格式(YZ转化选项一定要勾选). 另外,obj格式不支持动画,其实游戏中最常用的格式是"FBX"和"DAE"格式,

NuGet 问题及小技巧

在使用NuGet程序包管理时,经常会遇到的一些小问题.比如,联网搜索时间太长,搜索不到常见或想要的程序包,程序包版本兼容问题,想安装制定的版本等. 那么我们可以使用以下的一些小技巧来解决. 1.检查NuGet程序包来源设置(是否勾选https://www.nuget.org/api/v2/): 2.搜索你想要的程序包及版本,可以在nuget官网中搜索, http://www.nuget.org/packages/<程序包名>                         例如http://w

【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 之前学习的各种Shader时,我们从没有考虑在所有平台下的可用性.Unity是一个强大的跨

DevStore技术详解:Unity3D编辑器的那些小技巧

摘要:Unity引擎以其上手简单易懂而被广大开发者熟知,却很少有人对Unity编辑器的功能做一个全面细致的了解,一些非常实用的小功能在开发者的日常生活中往往被忽略,但是它的确对我们的工作效率的提升有不小的帮助,跟随小编,细数那些被我们遗漏的小技巧~ 1)锁定Inspector-在inspector面板上方有一个小"锁"图标,点击锁住后可以将inspector面板锁定在当前选择的GameObject上.在你需要大量设置某个GameObject的参数时非常有效(例如为一个数组里添加大量引用

【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 在上一篇里,我们学习了一些技巧来初步优化Shader.这次,我们学习更多的技术来实现一个更

《转》Unity3D研究院之UGUI一个优化效率小技巧

无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般UI里也就是按钮才需要接收响应事件,那么大部分image和text是是不需要开RaycastTarget的. 但是问题就来了,Unity默认在hierarchy窗口Create->UI->Image .Text的时候就会自动帮我们勾选上RaycastTarget, 一个复杂点的界面至少也300+个

VS2017一些小技巧

下面我总结一些VS2017中的一些小技巧这些小技巧,大神的你有可能早就知道了,也有可能我少说了,如果你觉得我写的不对,欢迎在下方进行评论: 1.TODO的使用 当你编辑代码的时候是不是遇到过,一个地方的代码需要调用另一个脚本中的内容,这时候我们就需要去另一个脚本进行查找,另一个脚本中的方法还没有进行完善,我们又需要先写后面这个脚本,当我们写完这个脚本,再想返回的时候,由于代码过多,那样你找起来就显得十分麻烦,这时候 我们就可以使用TODO进行查找,在你需要调用的地方加一个 //TODO 这里写上

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

给你一个云端的大脑01:印象笔记小技巧

我在上课时,很多学员们给我的反馈都是:老师你讲的太精彩啦,但我记不住.我最重视的就是学员的反馈,因为我是一个完美主义者,凡事既然做就要做到最好.而学员就像我的一面镜子,反馈是我改进的方向. 很久以前,我听到这样的反馈第一反应就是自己还是讲得不够好,但后来我的讲课都能hold住全场300多人的时候,我发现这个反馈仍然频繁出现,这不是我的问题而是学员们不会学习的问题,这样的学员在工作中也是缺乏自我培养的能力. 所以从今天起,我的平台又加入一个主题:给你一个云端的大脑.告诉你如何记笔记,如何整理大脑记