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 shader 基础之十一 动画屏幕后处理深度纹理
游戏开发解答Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)