首页 > 其他分享 >Unity shader实现水波的技术原理

Unity shader实现水波的技术原理

时间:2023-12-07 09:44:20浏览次数:39  
标签:水波 vertex shader Unity 水面 Speed

Unity shader 是 Unity 引擎中非常重要的一个部分,它可以用来实现各种各样的特效效果,其中包括水波效果。本文将详细讲解 Unity shader 实现水波的技术原理,并给出相关的 Shader 代码实现。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

首先,我们需要了解一下水波的物理原理。水波是由于水面上的液体分子在受到外力作用时发生的振动而产生的,这种振动可以传递到水面上的其他区域,形成波纹。因此,要实现水波效果,我们需要模拟这种振动。

在 Unity 中,我们可以通过 shader 来模拟水波的振动。具体实现方式为:首先,我们需要在 shader 中定义一个纹理,用来表示水面的高度。然后,我们可以通过修改这个纹理中的像素值,来模拟水面上的振动。在每一帧中,我们可以根据当前的时间和水面上每个像素的位置,来计算出这个像素的高度值。这个高度值可以通过某种算法来计算得到,例如使用 sin 函数来模拟正弦波的形状。

接下来,我们需要将这个高度值应用到水面的顶点上。在 shader 中,我们可以使用顶点着色器来对每个顶点进行处理。具体实现方式为:在顶点着色器中,我们可以将每个顶点的位置根据对应的纹理像素的高度值进行偏移。这样,我们就可以通过 shader 来实现水面的振动效果了。

下面是一个简单的 shader 代码示例,用于实现水波效果:

Shader "Custom/Water" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Speed ("Speed", Range(0, 10)) = 1
        _Height ("Height", Range(0, 1)) = 0.1
    }
 
    SubShader {
        Tags {"Queue"="Transparent" "RenderType"="Opaque"}
        LOD 100
 
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
 
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float4 worldPos : TEXCOORD1;
            };
 
            sampler2D _MainTex;
            float _Speed;
            float _Height;
 
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                float2 offset = float2(sin(_Time.y * _Speed + o.worldPos.x * 0.01),
                                       sin(_Time.y * _Speed + o.worldPos.y * 0.01));
                o.vertex.xy += offset * _Height;
                return o;
            }
 
            fixed4 frag (v2f i) : SV_Target {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

 

在这个 shader 中,我们定义了三个属性:_MainTex 表示水面的纹理,_Speed 表示水波的速度,_Height 表示水波的高度。在顶点着色器中,我们通过计算 sin 函数来模拟水波的振动,并将计算出的偏移量应用到顶点的位置上。在片段着色器中,我们直接对纹理进行采样,以便将水面的纹理显示出来。

综上所述,通过 Unity shader 来实现水波效果的原理是模拟水面上的振动,并将计算出的偏移量应用到水面的顶点上。通过这种方式,我们可以实现非常逼真的水波效果。

标签:水波,vertex,shader,Unity,水面,Speed
From: https://www.cnblogs.com/bycw/p/17880999.html

相关文章

  • Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画 鲨鱼辣椒 鲨鱼辣椒
    最近DOTS发布了正式的版本,我们来分享现在流行基于群体战斗的弹幕类游戏,实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。DOTS对角色动画支持的局限性截止到UnityDOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS的baker过程种,不支持......
  • Unity PIco事件封装
    usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingUnity.VisualScripting;usingUnityEngine;usingUnityEngine.Events;usingUnityEngine.XR;publicinterfaceIPicoKey<T>{publicvoidTryGetKey(PicoKeyEvent<T>......
  • Unity Transform接口的几个常用方法解析_unity基础开发教程
    UnityTransform接口常用方法解析1.Transform.position2.Transform.right、Transform.forward、Transform.up3.Transform.Rotate4.Transform.Translate在Unity中,Transform类是游戏对象位置、旋转和缩放的表示。在日常开发中我们回经常用到Transform接口的几个常用方法,这些方......
  • Unity底层是如何处理C#的
    在面试中,我们经常会被问到Unity的底层是如何处理C#,本节给通过一下3个点来给大家详细的分析这个问题:(1)C#的发展历史;(2)Unity为什么用C#;(3)il2cpp解决了什么问题;对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀C#的发展历史C#没有出来之前......
  • Unity DOTS系列之托管/非托管Component的区别与性能分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面托管与非托管Component的区别与性能分析,方便大家上手学习掌握UnityDOTS开发。托管与非托管的区别在于是不是基于自动垃圾回收的。托管是由垃圾回收器来负责自动回收,非托管需要我们手动来做相关内存管理,不被垃圾回收系统来处理。......
  • Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据
    最近DOTS发布了正式的版本,我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据,方便大家上手学习掌握UnityDOTS开发。SystemAPI.Query的使用System有两种,一种是Unmanaged的ISystem,一种是managed的SystemBase,这两种System都可以通过SystemAPI.Query来迭代与......
  • 如何量化shader的性能标准学习心得
    序言,开头耳  随着如今手游、主机游戏的开发越来越重度。硬件性能跟不上效果产生的能耗,开发者需要主动关注shader的性能问题,并合理指定标准。标准的制定前首先是让问题可被量化。  参考外网大佬的文章:https://thegamedev.guru/unity-gpu-performance/shader-cost-analysis-m......
  • unity里也能输出 webgl的项目,怎么看出这个项目是不是unity输出的,还是纯web技术写的项
    在Unity中输出为WebGL项目后,可以通过以下几种方式来判断一个项目是不是由Unity输出的:1.文件结构:Unity输出的WebGL项目通常会生成一些特定的文件和文件夹,例如"Build"文件夹、"index.html"文件等。如果你在项目文件夹中看到这些文件和文件夹,那么很可能是Unity输出的WebGL项目。2.......
  • Wpf 第三方Mvvm包(mvvmLight/Microsoft.Toolkit.Mvvm/CommunityToolkit.Mvvm)
    十年河东,十年河西,莫欺少年穷学无止境,精益求精 mvvmLight和 Microsoft.Toolkit.Mvvm已被Nuget弃用且不再更新,在此不作说明CommunityToolkit.Mvvm是NetCore版本引用包,详情参考:WPFMVVM框架:CommunityToolkit.Mvvm包使用介绍1、wpf项目中使用 CommunityToolkit.Mvvm(NetCore3.1......
  • 最新Unity DOTS教程之BlobAsset核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面BlobAsset机制,方便大家上手学习掌握UnityDOTS开发。BlobAsset 概叙DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译出来的类型。同......