【Unity】URP管線Shader編程實例詳解 (1) : 漩渦效果shader

作者說

  1. 本系列教程適用于有編程基礎和圖形學基礎知識的讀者.
  2. 如果對您有所幫助,請點個免費的贊和關注,您的支持就是我更新最大的動力!
  3. 如果你有任何想看的內容歡迎評論區留言!
  4. 本系列教程Github : https://github.com/Sky0Master/Unity-URP-Shader-Tutorial

效果預覽

Before
在這里插入圖片描述


準備工作

在Unity Assets文件夾里右鍵新建一個Unlit Shader
在這里插入圖片描述

命名之后,再右鍵這個shader,create -> material
在這里插入圖片描述
接著隨便把這個材質應用到一個Renderer上就行,我這里應用到了一個Sprite Renderer上


動手寫代碼!

現在我們來實現一個對紋理施加漩渦效果的shader,其實這個效果的原理就是在fragment著色器中對uv坐標進行繞中心旋轉的變換,使用變換后的uv坐標去采樣。(如果對【采樣】和【uv坐標】的概念比較熟悉的話應該能理解
每一行代碼我都進行了詳細的注釋,如果對其中有任何不明白的地方請在評論區留言,我會據此對注釋進行補充,感謝!

Shader "Unlit/SwirlEffect"
{Properties {_MainTex ("Base Texture", 2D) = "white" {}    // 基礎紋理輸入,用于最終顏色輸出_Angle ("Rotation Angle", Range(0,10)) = 2    // 控制旋轉強度的參數, Range(0,10)限制調節范圍避免過度扭曲_Radius ("Effect Radius", Range(0,1)) = 0.5   // 效果作用半徑,控制漩渦中心到邊緣的衰減范圍}SubShader{Tags { "RenderType"="Transparent" //著色器替換標簽,這個部分建議參考https://docs.unity3d.com/cn/current/Manual/SL-ShaderReplacement.html"Queue"="Transparent"	//設置渲染隊列為透明層級"RenderPipeline"="UniversalPipeline"  //聲明使用的渲染管線}Pass{Blend SrcAlpha OneMinusSrcAlpha // 使用標準透明度混合 讀者可以嘗試注釋掉這行會發生什么HLSLPROGRAM //使用URP標準的HLSL語法#pragma vertex vert // 聲明頂點著色器#pragma fragment frag  // 聲明片段著色器//#pragma multi_compile_fog //開啟霧效支持//URP專用#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes { //輸入數據結構 (URP命名規范)float4 positionOS : POSITION; //物體空間的頂點坐標float2 uv : TEXCOORD0;  //初始紋理坐標};struct Varyings {   //輸出數據結構 (URP命名規范)float4 positionCS : SV_POSITION; //裁剪空間坐標(SV_前綴)float2 uv : TEXCOORD0;  //傳遞紋理坐標};TEXTURE2D(_MainTex);    //在HLSL中,TEXTURE2D是一個宏,用于聲明紋理資源, 這行代碼告訴Shader存在一個名為_MainTex的2D紋理,供后續采樣使用SAMPLER(sampler_MainTex); //SAMPLER宏聲明采樣器狀態,與紋理綁定。URP中,紋理和采樣器通常是分開的,這樣可以更靈活地重用采樣器設置float _Angle;   //自定義的屬性,在Properties塊中聲明后,需要在HLSL代碼中再次聲明,以便在著色器中使用. 這樣可以在Properties和HLSL中同步變量,確保參數傳遞正確float _Radius;Varyings vert(Attributes IN) {Varyings OUT;OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz); // URP坐標變換OUT.uv = IN.uv;   // 直接傳遞UVreturn OUT;}half4 frag(Varyings IN) : SV_Target {// 計算中心偏移float2 centerOffset = IN.uv - float2(0.5,0.5);float distance = length(centerOffset);// 動態旋轉計算float rotation = _Angle * saturate(1 - distance/_Radius); //基于自定義半徑的衰減計算float sinRot, cosRot;   sincos(rotation, sinRot, cosRot); //性能優化,同時計算旋轉角度的sin和cos而不是分開計算// UV變換矩陣float2x2 rotMatrix = float2x2(cosRot, -sinRot, sinRot, cosRot); //旋轉矩陣構造float2 distortedUV = mul(rotMatrix, centerOffset) + 0.5;    //應用矩陣變換// 采樣紋理half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, distortedUV); //使用變換后的uv坐標去采樣紋理// 邊緣淡化float fade = smoothstep(_Radius, _Radius * 0.8, distance); //邊緣過渡優化return half4(color.rgb, color.a * fade);    //透明度混合}ENDHLSL}}
}

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

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

相關文章

如何安裝vm 和centos

安裝 VMware Workstation(以 Windows 系統為例) 1. 下載 VMware Workstation 打開 VMware 官方網站(Desktop Hypervisor Solutions | VMware ),在頁面中選擇適合你系統的版本進行下載。如果你是個人非商業使用&#x…

STM32-心知天氣項目

一、項目需求 使用 ESP8266 通過 HTTP 獲取天氣數據(心知天氣),并顯示在 OLED 屏幕上。 按鍵 1 :循環切換今天 / 明天 / 后天天氣數據; 按鍵 2 :更新天氣。 二、項目框圖 三、cjson作用 https://gi…

Wireshark簡單教程

1.打開Wireshark,點擊最上面欄目里面的“捕獲”中的“選項” 2.進入網卡選擇界面,選擇需要捕獲的選擇,這里我選擇WLAN 3.雙擊捕獲選擇出現下面界面 4.點擊如下圖紅方框即可停止捕獲 5.點擊下圖放大鏡可以進行放大 6.你也可以查詢tcp報文如下圖

【Http和Https區別】

概念: 一、Http協議 HTTP(超文本傳輸協議)是一種用于傳輸超媒體文檔(如HTML)的應用層協議,主要用于Web瀏覽器和服務器之間的通信。http也是客戶端和服務器之間請求與響應的標準協議,客戶端通常…

Unity Shader 學習13:屏幕后處理 - 使用高斯模糊的Bloom輝光效果

目錄 一、基本的后處理流程 - 以將畫面轉化為灰度圖為例 1. C#調用shader 2. Shader實現效果 二、Bloom輝光效果 1. 主要變量 2. Shader效果 (1)提取較亮區域 - pass1 (2)高斯模糊 - pass2&3 (3&#xff…

【R語言】dplyr包經典函數summarise函數

dplyr包經典函數summarise函數,后面改名乘reframe函數了,但是summarise仍然適用 這個函數的返回結果是一個新的數據框,下面講一下幾種常見用法 示例數據為R自帶的數據集mtcars 1.不分組 mtcars %>%summarise(mean mean(disp), n n()…

使用DeepSeek/ChatGPT等AI工具輔助編寫wireshark過濾器

隨著deepseek,chatgpt等大模型的能力越來越強大,本文將介紹借助deepseek,chatgpt等大模型工具,通過編寫提示詞,輔助生成全面的Wireshark顯示過濾器的能力。 每一種協議的字段眾多,流量分析的需求多種多樣,…

vscode設置自動換行

vscode設置自動換行 方法 方法 點擊文件->首選項->設置。搜索word wrap -> 選擇 on 。 搜索Word Wrap,并把選項改為on。

QT 中的元對象系統(一):元對象和元數據

目錄 1.為什么需要元系統 2.元數據 3.模擬元對象系統 3.1.元對象聲明 3.2.對C擴展 3.3初始化元對象 3.4.使用元對象 4.QT的元系統 4.1.元對象系統基于QObject類、Q_OBJECT宏、元對象編譯器MOC實現 4.2.元對象系統的功能 4.3.Q_PROPERTY()的使用 4.4.Q_INVOKABLE使用…

Pytorch實現之渾濁水下圖像增強

簡介 簡介:這也是一篇非常適合GAN小白們上手的架構文章!提出了一種基于GAN的水下圖像增強網絡。這種網絡與其他架構類似,生成器是卷積+激活函數+歸一化+殘差結構的組成,鑒別器是卷積+激活函數+歸一化以及全連接層。損失函數是常用的均方誤差、感知損失和對抗損失三部分。 …

TCPDF 任意文件讀取漏洞:隱藏在 PDF 生成背后的危險

在網絡安全的世界里,漏洞就像隱藏在黑暗中的“定時炸彈”,稍有不慎就會引發災難性的后果。今天,我們要聊的是一個與 PDF 生成相關的漏洞——TCPDF 任意文件讀取漏洞。這個漏洞可能讓攻擊者輕松讀取服務器上的敏感文件,甚至獲取整個…

【Git】六、企業級開發模型

文章目錄 Ⅰ. 前言Ⅱ. 系統開發環境Ⅲ. Git 分支設計規范master分支release分支develop分支feature分支hotfix分支 Ⅰ. 前言 ? 我們知道,一個軟件從零開始到最終交付,大概包括以下幾個階段:規劃、編碼、構建、測試、發布、部署和維護。 ?…

Kafka可視化工具EFAK(Kafka-eagle)安裝部署

Kafka Eagle是什么? Kafka Eagle是一款用于監控和管理Apache Kafka的開源系統,它提供了完善的管理頁面,例如Broker詳情、性能指標趨勢、Topic集合、消費者信息等。 源代碼地址:https://github.com/smartloli/kafka-eagle 前置條件…

C++:dfs,bfs各兩則

1.木棒 167. 木棒 - AcWing題庫 喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過 5050 個長度單位。 然后他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。 請你設計一個程序…

電子商務網站租用香港服務器的好處有哪些?

電子商務網站租用香港服務器的好處主要包括: 香港服務器提供高速的網絡連接,國內訪問速度優勢明顯,滿足企業內部數據傳輸和遠程辦公需求。擁有國際出口帶寬優勢,實現與全球各地的高速連接,對跨國業務和海外市場拓展至關…

stm32108鍵C-B全調性_動態可視化樂譜鋼琴

108鍵全調性鋼琴 一 基本介紹1 項目簡介2 實現方式3 項目構成 二 實現過程0 前置基本外設驅動1 聲音控制2 樂譜錄入&基礎樂理3 點陣屏譜點動態刷新4 項目交互控制5 錄入新曲子過程 三 展示,與鏈接視頻地址1 主要功能函數一覽2 下載鏈接3 視頻效果 一 基本介紹 …

【p-camera-h5】 一款開箱即用的H5相機插件,支持拍照、錄像、動態水印與樣式高度定制化。

【開源推薦】p-camera-h5:一款輕量級H5相機插件開發實踐 一、插件背景 在Web開發中,原生攝像頭功能的集成往往面臨以下痛點: 瀏覽器兼容性問題視頻流與水印疊加實現復雜移動端適配困難功能定制成本高 為此,p-camera-h5 —— 一…

交叉編譯curl(OpenSSL)移植ARM詳細步驟

運行配置腳本 使用 Configure 腳本配置 OpenSSL,指定目標平臺和安裝路徑: curl downloads 各個版本 Old 1.1.1 Releases | OpenSSL Library 各個版本 從 OpenSSL 官網下載源碼包 tar -xzf openssl-1.1.1b.tar.gz cd openssl-1.1.1b/運行配置腳本 使…

大語言模型中的 Token如何理解?

在大語言模型中,Token 是文本處理的基本單元,類似于“文字塊”,模型通過將文本分割成Token來理解和生成內容。舉一個形象一點的例子,可以理解為 AI 處理文字時的“最小積木塊”。就像搭樂高時,每塊積木是基礎單位一樣&…

表單制作代碼,登錄動畫背景前端模板

炫酷動效登錄頁 引言 在網頁設計中,按鈕是用戶交互的重要元素之一。一個炫酷的按鈕特效不僅能提升用戶體驗,還能為網頁增添獨特的視覺吸引力。今天,我們將通過CSS來實現一個“表單制作代碼,登錄動畫背景前端模板”。該素材呈現了數據符號排版顯示出人形的動畫效果,新穎有…