unity藤曼特效

9 篇文章 0 订阅
这篇博客介绍了如何在Unity中利用shader实现藤曼生长的视觉效果。通过调整_PBRMaterial参数,结合顶点法线向量和UV权重,实现了物体不同位置的缩放,从而模拟藤曼生长的过程。代码中展示了详细的vert和frag函数,以及相关属性设置,帮助读者理解并应用到自己的项目中。
摘要由CSDN通过智能技术生成

藤曼生长

预览视图

在这里插入图片描述在这里插入图片描述

PBR材质下的效果

显示更好看上ASE

在这里插入图片描述在这里插入图片描述在这里插入图片描述

简化版

可以乘以顶点法线向量可以实现物体的缩放,用一个UV图的权重控制不同位置缩放部分,可以形成藤曼的样子

ASE

在这里插入图片描述

代码

Properties
_MainTex ("Texture", 2D) = "white" {}
_Grow("Grow",Range(-1.0,1.0)) = 0.0
_Expend("Expend",Float) = 0.0
_Scale("Scale",Float) = 0.0
_GrowMin("GrowMin", Range(0,1.0)) = 0.6
_GrowMax("GrowMax", Range(0,1.5)) = 1.0
_EndMin("EndMin", Range(0,1.0)) = 0.6
_EndMax("EndMax", Range(0,1.5)) = 1.0 
appdata
struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal:NORMAL;
            };
vert
v2f vert (appdata v)
{
    v2f o;
    half weight = max(smoothstep( _GrowMin, _GrowMax, v.uv.y - _Grow), smoothstep(_EndMin, _EndMax,v.uv.y ));
    half3 weight_combine = weight * _Expend * 0.01f*v.normal;
    half3 scale_combine = _Scale * 0.01f * v.normal;
    half3 normal_combine = weight_combine + scale_combine;
    v.vertex.xyz = v.vertex.xyz+ normal_combine;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    return o;
}
frag
fixed4 frag(v2f i) : SV_Target
{
    clip(1 - (i.uv.y - _Grow));
    // sample the texture
    fixed4 col = tex2D(_MainTex, i.uv);
    return col;
}

总代码

Shader "Unlit/Vice1_Code"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Grow("Grow",Range(-1.0,1.0)) = 0.0
        _Expend("Expend",Float) = 0.0
        _Scale("Scale",Float) = 0.0
        _GrowMin("GrowMin", Range(0,1.0)) = 0.6
        _GrowMax("GrowMax", Range(0,1.5)) = 1.0
        _EndMin("EndMin", Range(0,1.0)) = 0.6
        _EndMax("EndMax", Range(0,1.5)) = 1.0 
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
           

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0; 
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Grow;
            float _Expend;
            float _GrowMin;
            float _GrowMax;
            float _EndMin;
            float _EndMax;
            float _Scale;
            v2f vert (appdata v)
            {
                v2f o;
                half weight = max(smoothstep( _GrowMin, _GrowMax, v.uv.y - _Grow), smoothstep(_EndMin, _EndMax,v.uv.y ));
                half3 weight_combine = weight * _Expend * 0.01f*v.normal;
                half3 scale_combine = _Scale * 0.01f * v.normal;
                half3 normal_combine = weight_combine + scale_combine;
                v.vertex.xyz = v.vertex.xyz+ normal_combine;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                clip(1 - (i.uv.y - _Grow));
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

总结

最近有一点偷懒,更新有点慢,新年快乐,新的一年,冲冲冲;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值