Unity 自发光(燃烧)溶解Shader

最后结合网络上一些不成熟的例子和文章的思路,写了一个表面着色器Shader,效果挺不错的,达到了要求,这里记录一下。
先上效果图:


面板可输入各类数值,注意给一个噪声贴图(这里是用Photoshop分层云彩滤镜生成):

 

 以下是Shader源码:

Shader "Custom/MyDissolveSurface" {
    Properties {
        _Color ("颜色", Color) = (1,1,1,1)
        _MainTex ("主贴图 (RGB)", 2D) = "white" {}
        _Glossiness ("平滑度", Range(0,1)) = 0.5
        _Metallic ("金属性", Range(0,1)) = 0.0
        _NoiseTex ("噪声贴图 (R)",2D) = "white"{}  
        _EdgeWidth("边缘宽度",Range(0,0.5)) = 0.1  
        _EdgeColor("边缘颜色",Color) =  (1,1,1,1)  
        _EdgeThresholdValue ("硬边缘阈值(0为不使用)",Range(0,1)) = 0.5  
        _DissolvePercentage ("溶解百分比",Range(0,1)) = 0  
    }

    SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            //原编译指令
            //#pragma surface surf Standard fullforwardshadows
            //增加addshadow以获得正确的阴影
            #pragma surface surf Standard fullforwardshadows addshadow
            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma target 3.0
            sampler2D _MainTex;
            sampler2D _NoiseTex;  
            float _EdgeWidth;  
            float4 _EdgeColor;  
            float _EdgeThresholdValue;  
            float _DissolvePercentage;

            struct Input {
                float2 uv_MainTex;
                float3 worldPos;
            };

            half _Glossiness;
            half _Metallic;
            fixed4 _Color;

            void surf (Input IN, inout SurfaceOutputStandard o) {

                // Albedo comes from a texture tinted by color
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                // Metallic and smoothness come from slider variables
                o.Metallic = _Metallic;
                o.Smoothness = _Glossiness;
                o.Alpha = c.a;
                float DissolveFactor = saturate(_DissolvePercentage);  
                //使用固定坐标
                // float noiseValue = tex2D(_NoiseTex,IN.uv_MainTex).r;   
                //使用世界坐标
                float noiseValue = tex2D(_NoiseTex,IN.worldPos.rg).r;

                //如果该值对应噪声图的值更大,则抛弃

                if(noiseValue <= DissolveFactor)  
                {  
                    discard;  
                }   
                float4 texColor = tex2D(_MainTex,IN.uv_MainTex) * _Color;  
                float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor));  
                float4 BlendColor = texColor * _EdgeColor;  

                if(_EdgeThresholdValue>0){
                //不使用渐变(硬边缘)
                float HardEdgeFactor=EdgeFactor;
                if(HardEdgeFactor>_EdgeThresholdValue){
                    HardEdgeFactor=1;
                    o.Emission =0;  
                }else{ 
                    HardEdgeFactor=0;
                    o.Emission =_EdgeColor; 
                }
                    o.Albedo = lerp(texColor,BlendColor,1-EdgeFactor);  
                }else{
                    o.Emission =0; 
                    //使用渐变(软边缘)
                if(_EdgeThresholdValue>=1){
                    o.Albedo = BlendColor; 
                    o.Alpha=0;
                }else{
                    o.Albedo = lerp(texColor,BlendColor,1 - EdgeFactor);  
                }
            }
        }
    ENDCG
    }
    FallBack "Diffuse"
}


参考文章:
 《Trifox》中的遮挡处理和溶解着色器技术(上)
http://gad.qq.com/article/detail/7190982
《Trifox》中的遮挡处理和溶解着色器技术(下)
http://gad.qq.com/article/detail/7190975
 Shader溶解特效
http://blog.csdn.net/xiaoge132/article/details/51657246
————————————————

原文链接:https://blog.csdn.net/qq_27534999/article/details/79452620

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity Shader是一种专门用于制作游戏的图形渲染程序。在大多数游戏中,我们都希望让模型展现出崭新的效果。有时候,如果希望模型边缘看起来发光,则需要使用Shader来进行处理。其中,模型外边缘自发光需要的是特别的处理技巧。 在Unity Shader中实现模型外边缘自发光的方法有很多,但最常见的方式就是通过控制深度、法线和颜色等参数来增加颜色和光亮度。首先,我们需要分析模型边缘的特性,找到边缘的物理体积和光照条件,然后再运用一定的OpenGL技巧给予模型侧面以足够的颜色和光亮度。 另外,还有一种方式可以实现模型的外边缘自发光。那就是将模型的整体颜色设置为辉光色,然后通过代码控制其背面渐变,来实现外边缘的自发光效果。这种方式主要是采用jungle Shader技术来实现模型纹理和物理光源之间的交互效果,运用较为广泛。 总之,实现Unity Shader模型外边缘自发光就需要理解模型的特性,进行合适的参数设置和处理技巧,才能得到理想的效果。不同的游戏场景和模型也会有不同的处理方式,需要开发者结合实际情况进行具体分析和调整。 ### 回答2: Unity Shader中的模型外边缘自发光,可以通过使用描边Shader实现。描边Shader是通过计算法线与表面之间的夹角来确定边缘,并将其与指定颜色进行混合,从而产生模型外边缘的自发光效果。实现该效果的方法有多种,一种常用的做法是在一个关于深度等级的RenderTexture上绘制描边效果,然后将其与原始场景渲染结果叠加在一起。此外,还可以使用几何着色器(Geometry Shader)来实现描边效果,但需要支持OpenGL 4.0以上版本的显卡才能正常运行。 描边Shader的效果取决于边缘权重的计算方法和颜色混合技术。使用不同的模型接口和最小距离阈值,可以调整边沿的宽度和数量。同时,利用颜色叠加,可以给边缘添加动态效果,比如透明度和闪烁等。在制作游戏时,可以通过组合描边Shader与材质、纹理、照明等属性,增强游戏画面的视觉效果,从而提高游戏的品质和受欢迎程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值