UnityURP 扭曲屏幕效果實現

UnityURP 扭曲屏幕效果實現

  • 前言
  • 項目
    • 下載URPGrabPass
    • 空間扭曲著色器實現
    • 添加可視化控制
    • 創建材質球并設置
    • 補充
      • 粒子使用步驟
      • CustomData映射
      • 移動設備優化
  • 鳴謝

前言

在Unity的Universal Render Pipeline (URP) 中,傳統的GrabPass功能被移除,借助URPGrabPass工具可以實現。

扭曲屏幕效果

項目

下載URPGrabPass

下載地址:https://github.com/Haruma-K/URPGrabPass
下載完成后解壓放入工程

URPGrabPass通過ScriptableRendererFeature機制,在渲染管線中插入自定義的Pass來捕獲屏幕顏色紋理。
插件提供兩種渲染時機:

  • AfterOpaques: 在不透明物體渲染后捕獲
  • AfterTransparents: 在透明物體渲染后捕獲

插件自動將捕獲的屏幕紋理以_GrabbedTexture的名稱傳遞給著色器,只需在著色器中聲明即可使用:

sampler2D _GrabbedTexture;

記得在渲染管線中添加RendererFeature
渲染管線中添加RendererFeature

空間扭曲著色器實現

Shader "Demo/SpatialFracture"
{Properties{_DisplacementTex("Displacement Texture", 2D) = "gray" {}_FractureIntensity("Fracture Intensity", Range(0.0, 2.0)) = 0.5_DistortionStrength("Distortion Strength", Range(0.0, 1.0)) = 0.3_FractureScale("Fracture Scale", Range(0.1, 5.0)) = 1.0_TimeSpeed("Time Speed", Range(0.0, 5.0)) = 1.0_RefractiveIndex("Refractive Index", Range(0.0, 1.0)) = 0.67[Toggle] _DebugDisplacement("Debug Displacement", Float) = 0[Toggle] _UseCustomData("Use Custom Data", Float) = 0}SubShader{Tags{"RenderType" = "Transparent" "RenderPipeline" = "UniversalRenderPipeline""Queue" = "Transparent"}Pass{Tags{"LightMode" = "UseColorTexture"}HLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma shader_feature _DEBUGDISPLACEMENT_ON#pragma shader_feature _USECUSTOMDATA_ON#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS : POSITION;float2 uv : TEXCOORD0;half3 normal : NORMAL;#ifdef _USECUSTOMDATA_ONfloat4 customData : TEXCOORD1;#endif};struct Varyings{float4 positionHCS : SV_POSITION;float2 uv : TEXCOORD0;half2 samplingViewportPos : TEXCOORD1;float3 worldPos : TEXCOORD2;#ifdef _USECUSTOMDATA_ONfloat4 customData : TEXCOORD3;#endif};sampler2D _GrabbedTexture;sampler2D _DisplacementTex;float4 _DisplacementTex_ST;float _FractureIntensity;float _DistortionStrength;float _FractureScale;float _TimeSpeed;float _RefractiveIndex;Varyings vert(Attributes IN){Varyings OUT;OUT.positionHCS = TransformObjectToHClip(IN.positionOS);OUT.uv = TRANSFORM_TEX(IN.uv, _DisplacementTex);OUT.worldPos = TransformObjectToWorld(IN.positionOS);// Calculate base screen positionfloat4 screenPos = ComputeScreenPos(OUT.positionHCS);OUT.samplingViewportPos = screenPos.xy / screenPos.w;#ifdef _USECUSTOMDATA_ONOUT.customData = IN.customData;#endifreturn OUT;}half4 frag(Varyings IN) : SV_Target{float2 uv = IN.uv;float time = _Time.y * _TimeSpeed;// Get parameters from CustomData or use defaults#ifdef _USECUSTOMDATA_ONfloat fractureIntensity = IN.customData.x;float distortionStrength = IN.customData.y;float fractureScale = IN.customData.z;float refractiveIndex = IN.customData.w;#elsefloat fractureIntensity = _FractureIntensity;float distortionStrength = _DistortionStrength;float fractureScale = _FractureScale;float refractiveIndex = _RefractiveIndex;#endif// Sample displacement texture with animationfloat2 animatedUV = uv * fractureScale + float2(time * 0.1, time * 0.05);float4 displacement = tex2D(_DisplacementTex, animatedUV);#ifdef _DEBUGDISPLACEMENT_ONreturn half4(displacement.rgb, 1.0);#endif// Convert displacement to offsetfloat2 totalDisplacement = (displacement.rg - 0.5) * fractureIntensity * distortionStrength;// Apply refractive distortion based on displacementfloat3 viewDir = normalize(IN.worldPos - _WorldSpaceCameraPos.xyz);float displacementIntensity = length(displacement.rg - 0.5);float2 refractiveOffset = viewDir.xy * refractiveIndex * displacementIntensity * 0.05;// Combine distortionsfloat2 finalUV = IN.samplingViewportPos + totalDisplacement + refractiveOffset;// Sample the grabbed texture with distorted coordinateshalf4 grabbedColor = tex2D(_GrabbedTexture, finalUV);return grabbedColor;}ENDHLSL}}
}

添加可視化控制

搭配可視化操作更佳

using UnityEngine;public class SpatialFractureShaderHelper : MonoBehaviour
{[Header("Shader Control")]public Material targetMaterial;[Header("Debug Options 調試模式,只展示置換貼圖")]public bool debugDisplacement = false;[Header("使用ParticleSystem傳入CustomData")]public bool useCustomData = false;[Header("Manual Parameter Control")][Range(0f, 2f)]public float fractureIntensity = 0.5f;[Range(0f, 1f)]public float distortionStrength = 0.3f;[Range(0.1f, 5f)]public float fractureScale = 1f;[Range(0f, 1f)]public float refractiveIndex = 0.67f;void Update(){if (targetMaterial == null) return;// 設置關鍵字SetKeyword("_DEBUGDISPLACEMENT_ON", debugDisplacement);SetKeyword("_USECUSTOMDATA_ON", useCustomData);// 如果不使用CustomData,則設置材質參數if (!useCustomData){targetMaterial.SetFloat("_FractureIntensity", fractureIntensity);targetMaterial.SetFloat("_DistortionStrength", distortionStrength);targetMaterial.SetFloat("_FractureScale", fractureScale);targetMaterial.SetFloat("_RefractiveIndex", refractiveIndex);}}void SetKeyword(string keyword, bool enabled){if (enabled)targetMaterial.EnableKeyword(keyword);elsetargetMaterial.DisableKeyword(keyword);}
}

創建材質球并設置

材質球設置

補充

粒子使用步驟

  1. 在粒子系統中啟用"Custom Vertex Streams"
  2. 添加"Custom1.xyzw"到vertex streams列表
  3. 在CustomData模塊中設置參數值
  4. 在材質上啟用"Use Custom Data"選項

CustomData映射

  • Custom1.x → 破裂強度 (Fracture Intensity)
  • Custom1.y → 扭曲強度 (Distortion Strength)
  • Custom1.z → 破裂縮放 (Fracture Scale)
  • Custom1.w → 折射指數 (Refractive Index)

移動設備優化

#ifdef _MOBILEOPTIMIZATION_ON
// 簡化版:直接使用位移作為折射偏移
half2 refractiveOffset = (displacement.rg - 0.5h) * refractiveIndex * 0.05h;
#else
// 完整版:基于視角方向的真實折射
half3 viewDir = normalize(IN.worldPos - _WorldSpaceCameraPos.xyz);
half displacementIntensity = length(displacement.rg - 0.5h);
half2 refractiveOffset = viewDir.xy * refractiveIndex * displacementIntensity * 0.05h;
#endif

鳴謝

URPGrabPass
Claude Code

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

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

相關文章

(三)軟件架構設計

2024年博主考軟考高級系統架構師沒通過,于是決定集中精力認真學習系統架構的每一個環節,并在2025年軟考中取得了不錯的成績,雖然做信息安全的考架構師很難,但找對方法,問題就不大! 本文主要是博主在學習過程…

切記使用mt19937構造隨機數

在做 Kazaee CodeForces - 1746F 這個問題的時候,最初的時候使用了ran(),然后一直WA,遂改成mt19937,順利通過本道題。 mt19937 Rand(time(0)); 調用隨機數時候,使用: Rand() & 1 注意看&#xff0…

基于N32G45x+RTT驅動框架的定時器外部計數

時鐘選擇 高級控制定時器的內部時鐘:CK_INT: 兩種外部時鐘模式: 外部輸入引腳 外部觸發輸入 ETR 內部觸發輸入(ITRx):一個定時器用作另一個定時器的預分頻器 外部時鐘原理 通過配置 TIMx_SMCTRL.SMSEL=111 選擇該模式。 計數器可以配置為在所選輸入的時鐘上升沿或下降沿 …

[特殊字符] Ubuntu 下 MySQL 離線部署教學(含手動步驟與一鍵腳本)

適用于 Ubuntu 20.04 / 22.04 無網絡環境部署 MySQL。 建議初學者先按手動方式部署一遍理解原理,再使用自動化腳本完成批量部署。📁 一、準備工作 ? 1. 虛擬機環境 系統:Ubuntu 22.04(或兼容版本)環境:無網…

系統一個小時多次Full GC,導致系統線程停止運行,影響系統的性能,可靠性

背景: 某一天系統出現了請求超時,然后通過日志查看,程序執行到某一個位置,直接停下來來了,或者說所有的線程的執行都停下來了。而且是該時間段,請求處理變慢。排查相關的服務,并沒有出現死鎖&am…

使用OMV+NextCloud搭建私有云

原文地址:使用OMVNextCloud搭建私有云 – 無敵牛 歡迎參觀我的網站:無敵牛 – 技術/著作/典籍/分享等 OpenMediaVault(簡稱OMV)是一款基于Debian的開源網絡存儲(NAS)操作系統,提供Web管理界面&…

Codeforces Round 1008 (Div. 2)

A. Final Verdict 題目大意 給你一個數組a,每次把他拆分為等長的k個子序列,然后用子序列的平均數替換掉這個子序列,問最后能不能讓數組只剩下一個數字x 解題思路 無論怎么劃分,最后的總值是不變的,所以只需要看總和…

python轉移安裝目錄到D盤

遷移python安裝路徑第一步:移動目錄第二步:修改環境變量之前沒有設置之前設置過第一步:移動目錄 源路徑: C:\Users\Emma.ZRF\AppData\Local\Programs\Python\Python38 原環境變量 C:\Users\Emma.ZRF\AppData\Local\Programs\Pyth…

C#垃圾回收機制:原理與實踐

C#垃圾回收機制:原理與實踐 一、垃圾回收:C#內存管理的“幕后功臣”? 二、GC的核心引擎:基于代的優化策略 三、Demo展示 1. 簡單對象的垃圾回收示例 2. 基于代的回收示例 四、常用方法 五、推薦使用的場景 六、注意事項 管住手:避免濫用 GC.Collect() 析構函數:保持輕量 …

基于SpringBoot+MyBatis+MySQL+VUE實現的名城小區物業管理系統(附源碼+數據庫+畢業論文+開題報告+部署教程+配套軟件)

摘要 當下,正處于信息化的時代,許多行業順應時代的變化,結合使用計算機技術向數字化、信息化建設邁進。以前相關行業對于物業信息的管理和控制,采用人工登記的方式保存相關數據,這種以人力為主的管理模式已然落后。本人…

3DXML 轉換為 UG 的技術指南及迪威模型網在線轉換推薦

一、3DXML 轉換為 UG 的必要性 (一)軟件功能利用需求 3DXML 格式由達索系統開發,主要用于在其相關產品(如 CATIA、SOLIDWORKS 和 3DEXPERIENCE 等)中進行 3D 數據交換與輕量化可視化。它雖然能夠很好地在達索生態內實…

無人機光伏巡檢缺陷檢出率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析,引用來源標注 “陌訊技術白皮書”,禁止未經授權的轉載與改編。摘要在無人機光伏巡檢場景中,邊緣計算優化與復雜場景魯棒性是提升檢測效率的核心挑戰。本文解析陌訊多模態融合算法在光伏板熱斑、隱裂等缺陷檢測中的…

倉庫管理系統-15-前端之管理員管理和用戶管理

文章目錄 1 后臺查詢用戶列表 1.1 null和空字符串的檢查 1.2 UserController.java 2 管理員管理 2.1 傳遞參數roleId=1 2.2 admin/AdminManage.vue 3 用戶管理 3.1 傳遞參數roleId=2 3.2 user/UserManage.vue 管理員管理和用戶管理,與之前的Main.vue的內容基本一致,無非是管理…

個人筆記UDP

UDP消息發送發送端? import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; ? //不需要連接服務器 public class UdpClientDemo01 {public static void main(String[] args) throws Exception {/…

26屆算法秋招_baidu筆試_算法編程題。

給定2個字符串str1、str2,計算把str1轉變為str2的最小操作數。可執行的操作有:插入一個字符修改一個字符刪除一個字符解題:這是一個經典的編輯距離問題,通常使用動態規劃解決。定義dp[i][j]表示將str1的前i個字符轉換為str2的前j個…

uniapp-vue3來實現一個金額千分位展示效果

前言:uniapp-vue3來實現一個金額千分位展示效果實現效果:實現目標:1、封裝組件,組件內部要實現,input輸入金額后,聚焦離開后,金額以千分位效果展示,聚焦后展示大寫金額的彈框隨時寫的…

途游Android面試題及參考答案

對 Java 面向對象的理解是什么?多態的實現方法有哪些? Java 面向對象是一種編程思想,核心在于將現實世界中的事物抽象為 “對象”,每個對象由 “屬性”(數據)和 “方法”(行為)組成,通過對象之間的交互完成功能。其核心特性包括封裝、繼承和多態: 封裝是指將對象的屬…

通過filezilla在局域網下實現高速傳輸數據

一. filezilla安裝 1.1 linux安裝 sudo apt update sudo apt install openssh-server1.2 windows安裝 windows安裝可以參考這篇文章 二. 使用方法 2.1 wifi下使用方法 直接查看想要連接的電腦的ip,其他的按照有線網絡設置好了ip之后進行連接就行。 2.2 有線網…

python的易物小店交換系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 在需求分…

[硬件電路-119]:模擬電路 - 信號處理電路 - 比較器,模擬電路中的“決策者”,模擬信號到數字電平邏輯信號的轉化者...

前言:比較器的價值1、為何稱比較器為“決策者”?邏輯判斷的物理實現比較器通過硬件電路直接完成“大于/小于”的二元判斷,無需軟件干預。例如:在過壓保護電路中,比較器實時監測輸入電壓 Vin? 與參考電壓 Vref?&#…