Unity shader glsl著色器特效之 模擬海面海浪效果

一個簡單的海浪效果,通過波的疊加實現水面起伏的動效,根據波峰斜率來為浪花著色,再根據法線貼圖和水花貼圖來和調整uv的平滑移動來增強海浪移動的細節。如果需要更逼真的效果可以考慮在滿足浪花觸發的地方添加粒子系統

前置效果圖
因為是很久以前寫的文章,貼圖已經找不到了,隨便PS了兩張看看效果
請添加圖片描述
請添加圖片描述
inspector的可調項目
在這里插入圖片描述

原理介紹

水波部分使用4個不同參數的Gerstner波疊加,不同波長(10m/5m/3m/7m)不同傳播方向(0°/45°/90°/135°),動態計算頂點偏移量:

offset += GerstnerWave(10.0, 0.3, 1.2, 0.0, worldPos, tangent, binormal);

通過交叉計算切線/副切線生成基礎法線,疊加噪聲貼圖增加細節:

float3 noiseNormal = UnpackNormal(tex2D(_NoiseTex, IN.uv_NoiseTex));
o.Normal = normalize(noiseNormal + o.Normal);

水花效果實現,基于表面坡度檢測生成水花:

float slope = 1 - o.Normal.y;
float foam = saturate(slope * 5 - 0.7) * foamTex.r;

光源反饋采用菲涅爾反射效果:

float fresnel = pow(1.0 - saturate(dot(o.Normal, IN.viewDir)), 4);

動態鏡面反射:

o.Smoothness = _Gloss * (1 - foam);

完整代碼

Shader "Custom/OceanWave" {Properties {_MainColor ("Main Color", Color) = (0.1, 0.3, 0.6, 1)_FoamColor ("Foam Color", Color) = (1,1,1,1)_WaveScale ("Wave Scale", Range(0,2)) = 0.5_WaveSpeed ("Wave Speed", Range(0,5)) = 1.2_NoiseTex ("Noise Texture", 2D) = "white" {}_FoamTex ("Foam Texture", 2D) = "white" {}_Gloss ("Gloss", Range(0,1)) = 0.8_NoiseUVSpeed ("Noise UV Speed", Vector) = (0.1, 0.1, 0, 0) // 添加噪聲紋理UV移動速度_FoamUVSpeed ("Foam UV Speed", Vector) = (0.1, 0.1, 0, 0)  // 添加水花紋理UV移動速度}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM#pragma surface surf Standard vertex:vert addshadow#pragma target 3.0#include "UnityCG.cginc"struct Input {float3 worldPos;float3 viewDir;float2 uv_NoiseTex;float2 uv_FoamTex;};// 屬性聲明fixed4 _MainColor;fixed4 _FoamColor;sampler2D _NoiseTex;sampler2D _FoamTex;float _WaveScale;float _WaveSpeed;float _Gloss;float4 _NoiseUVSpeed;float4 _FoamUVSpeed;// Gerstner波函數float3 GerstnerWave(float wavelength,float amplitude,float speed,float direction,float3 position,inout float3 tangent,inout float3 binormal) {float k = 2 * UNITY_PI / wavelength;float c = sqrt(9.8 / k);float2 d = float2(sin(direction), cos(direction));float f = k * (dot(d, position.xz) - c * speed * _Time.y);float a = amplitude / k;tangent += float3(-d.x * d.x * (amplitude * sin(f)),d.x * (amplitude * cos(f)),-d.x * d.y * (amplitude * sin(f)));binormal += float3(-d.x * d.y * (amplitude * sin(f)),d.y * (amplitude * cos(f)),-d.y * d.y * (amplitude * sin(f)));return float3(d.x * (a * cos(f)),a * sin(f),d.y * (a * cos(f)));}// 頂點著色器void vert(inout appdata_full v, out Input o) {UNITY_INITIALIZE_OUTPUT(Input, o);float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;float3 tangent = float3(1,0,0);float3 binormal = float3(0,0,1);float3 offset = 0;// 疊加四個不同參數的波浪offset += GerstnerWave(10.0, 0.3, 1.2, 0.0, worldPos, tangent, binormal);offset += GerstnerWave(5.0, 0.2, 1.5, 0.785, worldPos, tangent, binormal);offset += GerstnerWave(3.0, 0.1, 2.0, 1.570, worldPos, tangent, binormal);offset += GerstnerWave(7.0, 0.15, 1.0, 2.356, worldPos, tangent, binormal);// 計算法線float3 normal = normalize(cross(binormal, tangent));v.normal = mul((float3x3)unity_WorldToObject, normal);worldPos += offset;v.vertex.xyz = mul(unity_WorldToObject, float4(worldPos, 1)).xyz;}// 表面著色器void surf (Input IN, inout SurfaceOutputStandard o) {// 計算UV偏移float2 noiseUVOffset = _NoiseUVSpeed.xy * _Time.y;float2 foamUVOffset = _FoamUVSpeed.xy * _Time.y;// 應用UV偏移float2 noisyUV = IN.uv_NoiseTex + noiseUVOffset;float2 foamUV = IN.uv_FoamTex + foamUVOffset;// 基礎顏色fixed4 mainColor = _MainColor;// 法線計算float3 noiseNormal = UnpackNormal(tex2D(_NoiseTex, noisyUV));o.Normal = normalize(noiseNormal + o.Normal);// 水花效果float slope = 1 - o.Normal.y;fixed4 foamTex = tex2D(_FoamTex, foamUV);float foam = saturate(slope * 5 - 0.7) * foamTex.r;// 菲涅爾反射float fresnel = pow(1.0 - saturate(dot(o.Normal, IN.viewDir)), 4);// 最終顏色合成o.Albedo = lerp(mainColor.rgb, _FoamColor.rgb, foam);o.Metallic = 0.0;o.Smoothness = _Gloss * (1 - foam);o.Alpha = mainColor.a;}ENDCG}FallBack "Diffuse"
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70459.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能經濟與個人智能助理有什么發展

智能經濟與個人智能助理有什么發展 技術融合創新 研究個人助理與新興技術(如量子計算、邊緣計算)融合,分析對智能經濟的推動作用。探索量子計算提升數據處理速度,邊緣計算降低延遲,提升個人助理性能的機制&#xff0…

spring日志

前言 入門 這些就是日志 現在開始使用一下 spring是集合了日志的 注意選這個 這樣我們就創建好了一個日志對象了 我們就可以這樣打印日志了 日志和普通的打印消息相比,區別就是多個一些時間之類的消息 從左到右分別是時間,級別,PID&#x…

整合Salesmart/WhatsApp、開源Odoo模塊和Deepseek AI能力,實現針對國外客戶的智能客服和個性化推薦服務

一、項目背景 本文提出了一套針對軟管制造公司的智能客服與個性化推薦系統實施方案,旨在通過整合開源Odoo模塊、Salesmart/WhatsApp以及Deepseek AI能力,打造一個724小時不間斷服務的智能化平臺,專注于服務國外客戶。方案圍繞實現不間斷服務…

Java中JDK、JRE,JVM之間的關系

Java中的JDK、JRE和JVM是三個核心概念,其關系可概括為JDK > JRE > JVM,具體如下: 一、定義與作用 JDK(Java Development Kit) 定義:Java開發工具包,用于開發和編譯Java程序。包含內容&…

用C++ Qt實現安卓電池充電動效 | 打造工業級電量控件

一、為什么需要自定義電池控件? 在工業控制、車機系統、智能硬件等領域的UI開發中,電池狀態顯示是高頻出現的UI組件。通過實現一個支持顏色漸變、動態充電動畫、警戒閾值提示的電池控件,開發者可以系統掌握以下核心能力: Qt繪圖…

Django+Vue3全棧開發實戰:從零搭建博客系統

文章目錄 1. 開發環境準備2. 創建Django項目與配置3. 設計數據模型與API4. 使用DRF創建RESTful API5. 創建Vue3項目與配置6. 前端頁面開發與組件設計7. 前后端交互與Axios集成8. 項目優化與調試9. 部署上線10. 總結與擴展10.1 項目總結10.1.1 技術棧回顧10.1.2 項目亮點 10.2 擴…

Django 5實用指南(五)模板系統

Django5的模板系統是其核心功能之一,允許開發者將動態數據嵌入到HTML模板中,并根據不同的業務需求渲染頁面。Django模板系統基于 Django模板語言(DTL),它提供了一些強大的功能,如模板標簽、過濾器、條件語句…

uni-app開發app時 使用uni.chooseLocation遇到的問題

問題一:不顯示 問題二:選擇地址列表一直在加載中 因為 uni-app 接口文檔 中已經說明,使用騰訊的話需要開啟云服務,具體可看官網,這就是為什么使用時直接不顯示的原因,所以我使用的高德,但又出現…

推薦系統-排序模型

本次學習的重點是FM系列和WideNDeep系列。其實這兩個模型是存在因果關系的。從最初的LR模型開始,因為缺失高效的特征交互方式,產生了FM模型,即通過向量內積代替特征之間的兩兩交互的參數。最后DNN的引入可以建模更高階的特征。但是DNN如何與F…

體驗用ai做了個python小游戲

體驗用ai做了個python小游戲 寫在前面使用的工具2.增加功能1.要求增加視頻作為背景。2.我讓增加了一個歡迎頁面。3.我發現中文顯示有問題。4.我提出了背景修改意見,歡迎頁面和結束頁面背景是視頻,游戲頁面背景是靜態圖片。5.提出增加更多游戲元素。 總結…

c#爬取數據并解析json

安裝 Newtonsoft.Json Install-Package Newtonsoft.Json代碼 HttpClient client new HttpClient();// 獲取網頁內容HttpResponseMessage response client.GetAsync("https://opentdb.com/api.php?amount10&category18&difficultyeasy&typemultiple"…

計算機畢業設計Python農產品推薦系統 農產品爬蟲 農產品可視化 農產品大數據(源碼+LW文檔+PPT+講解)

溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 作者簡介:Java領…

【分布式理論13】分布式存儲:數據存儲難題與解決之道

文章目錄 一、數據存儲面臨的問題二、RAID磁盤陣列的解決方案1. RAID概述2. RAID使用的技術3. RAID的代表性等級 三、分布式存儲的新思路1. 分布式存儲背景與特點2. 分布式存儲的組成要素 一、數據存儲面臨的問題 在單機系統時代,當數據量不斷增加、硬盤空間不夠時…

高德地圖android sdk(備忘)

依賴 // 權限請求框架:https://github.com/getActivity/XXPermissions implementation com.github.getActivity:XXPermissions:20.0 // https://mvnrepository.com/artifact/com.amap.api/navi-3dmap-location-search implementation com.amap.api:navi-3dmap-loca…

DeepSeek、微信、硅基流動、納米搜索、秘塔搜索……十種不同方法實現DeepSeek使用自由

為了讓大家實現 DeepSeek 使用自由,今天分享 10 個暢用 DeepSeek 的平臺。 一、官方滿血版:DeepSeek官網與APP 首推,肯定是 DeepSeek 的官網和 APP,可以使用滿血版 R1 和 V3 模型,以及聯網功能。 網址: htt…

自動化之ansible(二)

一、ansible中playbook(劇本) 官方文檔: Ansible playbooks — Ansible Community Documentation 1、playbook的基本結構 一個基本的playbook由以下幾個主要部分組成 hosts: 定義要執行任務的主機組或主機。 become: 是否需要使用超級用戶…

python 神經網絡教程,神經網絡模型代碼python,小白入門基礎教程

文章目錄 前言1. 神經網絡基礎概念1.1 神經元1.2 激活函數1.3 神經網絡結構1.4 安裝 Python1.5 選擇開發環境2. 使用numpy構建簡單神經網絡 3. 使用PyTorch構建復雜神經網絡 前言 本教程旨在為廣大初學者和有一定基礎的開發者提供一個系統、全面且深入的 Python 神經網絡學習指…

SOME/IP--協議英文原文講解10

前言 SOME/IP協議越來越多的用于汽車電子行業中,關于協議詳細完全的中文資料卻沒有,所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊: 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 4.2.2 Req…

Spring框架基本使用(Maven詳解)

前言: 當我們創建項目的時候,第一步少不了搭建環境的相關準備工作。 那么如果想讓我們的項目做起來方便快捷,應該引入更多的管理工具,幫我們管理。 Maven的出現幫我們大大解決了管理的難題!! Maven&#xf…

用大內存主機下載Visual Studio

用一臺內存達到128G的主機下載Visual Studio 2022,用的是公司網絡。下載速度讓我吃了一驚,沒人用網絡了?還是網站提速了?以前最大只能達到5MB/秒。記錄這段經歷,是用來分析公司網絡用的......