Unity ShaderLab特效教程 着色器实例 代码+详解注释 【模型顶点漂浮,顶点升降过渡抖动的效果】

如果代码中有什么不清楚请查看以下基础知识

Shader基础知识
unity3d 中 七种坐标知识详解
顶点有规律的上下浮动的效果

该效果可以使静态模型拥有动感,比较适合应用在水面海浪、定格动画模拟,数据可视化等场景。效果图中使用了网格显示,实际上顶点浮动可以使用在各种shader中,核心部分都在顶点着色器里,直接拿走即可。

在这里插入图片描述

Shader "Unlit/simple"
{
    //变量接口
    Properties
    {
        //线段长度
        _MovePower("power",float) = 1.
        _MoveSpeed("speed",float) = 1.
        //线段颜色
        _LineColor("Color",COLOR) = (0,1,0,1)
    }
    //着色器正文
    SubShader
    {
        //着色器程序块
        Pass
        {
            Tags { "RenderType" = "Opaque" }
            LOD 200
            
            CGPROGRAM
            #pragma target 5.0
            //顶点着色器,用于处理位置信息
            #pragma vertex vert
            //片元着色器,用于处理颜色
            #pragma fragment frag
            //几何着色器,DirectX 10新增的,介于顶点和片元着色器之间的可选着色器
            #pragma geometry geo
            //引入空间转换宏
            #include "UnityCG.cginc"
            
            float _MovePower;
            float _MoveSpeed;
            fixed4 _LineColor;
            //输入到顶点着色器的数据
            struct v2g
            {
                //顶点位置
                float4  pos       : POSITION;
                //法线
                float3  normal    : NORMAL;
                //纹理坐
                float2  tex0        : TEXCOORD0;
            };
            //输入到片元着色器的数据
            struct g2f
            {
                //像素位置
                float4  pos       : POSITION;
                //纹理
                float2  tex0        : TEXCOORD0;
            };

            //顶点着色器,这里是顶点浮动的核心部分,可以直接移植到任何地方
            v2g vert(appdata_base v)
            {
                v2g o;      
                o.normal = v.normal;
                o.tex0 = v.texcoord;
                //模型坐标转为世界坐标,因为要计算绝对位置
                o.pos = mul(unity_ObjectToWorld, v.vertex);
                //顶点的高度 = 原顶点高度+ sin(原顶点x值+时间长度)* 幅度
                o.pos.y = o.pos.y + sin(o.pos.x + (_Time.y * _MoveSpeed)) * _MovePower;     
                //将坐标转为裁剪空间,否则就无法正常可视化
                o.pos = mul(UNITY_MATRIX_VP, o.pos);
                return o;
            }

            //几何着色器,放在顶点和片元之间。
            //maxvertexcount设置从顶点着色器到几何着色器每次输出最大顶点数量
            //输入修饰有point、line、triangle、lineadj、triangleadj分别对应点、线、三角形、有临接的线段、有邻接的三角形
            //inout输出修饰类型有PointStream、LineStream、TriangleStream,分别显示顶点、线段、三角面
            //输入顶点的信息,inout这里是将一个数据传入函数,在函数中的修改会返回到函数外的数据
            //一次接受triangle的3个顶点数据,输出为LineStream的3条线段
            [maxvertexcount(3)]
            void geo(triangle v2g vg[3], inout LineStream<g2f> ls)
            {
                //轮询一个片元的三个顶点,这里i<2去掉了斜线
                for (int i = 1; i < 3; i++)
                {
                    //初始化一个像素信息
                    g2f g2f_1;
                    //获取每个顶点的位置
                    g2f_1.pos = vg[i].pos;
                    //初始化纹理
                    g2f_1.tex0 = float2(0.0f, 0.0f);
                    //将点压入线条数据
                    ls.Append(g2f_1);
                }
                //即使点不够,也会终止一个循环,并重新开始
                ls.RestartStrip();
            }
            
            //片元着色器,用于上色
            fixed4 frag(g2f input) : COLOR
            {
                return _LineColor;
            }
            ENDCG
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值