Unity小技巧 - 烧熔Shader

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Unity小技巧 - 烧熔Shader的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

Unity中Shader的三种基本类型

unity shader学习笔记 shader基础结构以及Properties面板

Shader HLSL片段说明

[Unity Shader] 渲染管线流程

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)