Unity之ASE 顶点偏移实现心电图

Posted PassionY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity之ASE 顶点偏移实现心电图相关的知识,希望对你有一定的参考价值。

前言

前面我们讲过一次顶点偏移,做的是【深空之眼-潮汐技能】,其实定点偏移还可以做很多有意思的功能。比如今天我们要实现的心电图波浪线。效果如下:

实现原理

1.贴图叠加HDR

我们给MainTex乘上一个HDR的叠加色,这样可以有更好的效果,如下图所示:

HDR颜色设定

2.扰动图-顶点偏移

我们只做一个扰动效果,之前讲过很多次,通过一个流动的Noise图,然后R通道从【0,1】Remap到【-0.5,0.5】,乘以一个震动频率Franqunce,最后输出一个3维的向量,我们只赋值Y即可让顶点在Y轴做上下偏移


UV记得映射一下NoiseTex,这样可以在材质面板设定Noise图UV的Tilling和Offset值。

unity urp 渲染管线顶点偏移的实现

这里我是通过法线对顶点进行偏移

如果面与面之间的点不是公用的,会出现屏幕中立方体的效果,球则没有这个问题。所以使用顶点偏移的时候需要注意一下。
我实现的是在模型空间进行顶点偏移,大家按自己的需求实现

接下来,代码:

Shader "URP/VertexOffset"

    Properties
    
        [MainTexture] _BaseMap ("Albedo", 2D) = "white"  
        [MainColor] _BaseColor ("Color", Color) = (1, 1, 1, 1)
        
        _Cutoff ("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        _VertexOffset ("顶点偏移", Float) = 0
        
        _Cull ("Cull", Int) = 2

    

    SubShader
    
        Tags  "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit" "IgnoreProjector" = "True" "ShaderModel" = "4.5" 
        LOD 300

        // ------------------------------------------------------------------
        //  Forward pass. Shades all light in a single pass. GI + emission + Fog
        Pass
        
            Tags  "LightMode" = "UniversalForward" 
            Cull[_Cull]

            HLSLPROGRAM

            #pragma exclude_renderers gles gles3 glcore
            #pragma target 4.5

            //--------------------------------------
            // GPU Instancing
            #pragma multi_compile_instancing
            #pragma instancing_options renderinglayer
            #pragma multi_compile _ DOTS_INSTANCING_ON

            #pragma vertex LitPassVertex
            #pragma fragment LitPassFragment

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            //需要光照系统时增加此引入
            // #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attributes
            
                float4 positionOS : POSITION;
                float3 normalOS : NORMAL;
                float4 tangentOS : TANGENT;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            ;

            struct Varyings
            
                float2 uv : TEXCOORD0;
                float4 positionCS : SV_POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            ;

            TEXTURE2D(_BaseMap);        SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
            half4 _BaseColor;
            half4 _BaseMap_ST;
            half _Cutoff;
            half _VertexOffset;
            CBUFFER_END

            // Used in Standard (Physically Based) shader
            Varyings LitPassVertex(Attributes input)
            
                Varyings output = (Varyings)0;

                UNITY_SETUP_INSTANCE_ID(input);
                UNITY_TRANSFER_INSTANCE_ID(input, output);

                //通过法向偏移顶点
                half3 positionOS = input.positionOS.xyz;
                positionOS += input.normalOS * _VertexOffset;

                output.positionCS = TransformObjectToHClip(positionOS);
                output.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);

                return output;
            

            half4 LitPassFragment(Varyings input) : SV_Target
            
                UNITY_SETUP_INSTANCE_ID(input);
                //---------------输入数据-----------------
                float2 UV = input.uv;

                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv) * _BaseColor;
                clip(color.r - _Cutoff);

                return color;
            
            ENDHLSL

        

    

    FallBack "Hidden/Universal Render Pipeline/FallbackError"


以上是关于Unity之ASE 顶点偏移实现心电图的主要内容,如果未能解决你的问题,请参考以下文章

unity urp 渲染管线顶点偏移的实现

Unity 之ASE实现触电,电流,电脉冲效果

Unity之ASE 编辑器详解

Unity之ASE 简介

unity shader 基础之十一 动画屏幕后处理深度纹理

游戏开发解答Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)