UE5 Computer Shader學習筆記

首先這里是綁定.usf文件的路徑,并聲明是用聲明著色器

上面就是對應的usf文件路徑,在第一張圖進行鏈接

Shader Frequency 的作用

Shader Frequency 是 Unreal Engine 中用于描述著色器類型和其執行階段的分類。常見的 Shader Frequency 包括:

  • SF_Vertex:頂點著色器。

  • SF_Pixel:像素著色器(也稱為片段著色器)。

  • SF_Geometry:幾何著色器。

  • SF_Compute:計算著色器。

  • SF_RayGen:光線追蹤著色器(用于光線追蹤管線)。

SF_Compute?專門用于標識計算著色器,這是一種不直接參與圖形渲染的著色器,而是用于通用計算任務(如 GPU 加速計算)。

使用場景:

1. SF_Vertex(頂點著色器)

作用:處理模型頂點數據,進行空間變換或頂點級計算。
使用場景

  • 頂點動畫
    通過修改頂點位置實現動態效果,如旗幟飄動、水面波動、角色呼吸動畫。

  • 模型變形
    程序化調整頂點位置(如擠壓、膨脹、扭曲效果)。

  • 蒙皮網格(Skinned Mesh)
    在骨骼動畫中計算頂點最終位置。

  • 頂點光照預計算
    對頂點法線進行初步光照計算(較少用,通常由像素著色器處理)。

    2. SF_Pixel(像素著色器/片段著色器)

    作用:計算每個像素的最終顏色,處理光照、紋理、材質等。
    使用場景

  • 材質著色
    結合紋理采樣、法線貼圖、粗糙度等參數實現復雜表面效果(如金屬、皮膚、布料)。

  • 后處理效果
    屏幕空間效果(如景深、模糊、顏色分級、HDR)。

  • 透明度與混合
    處理半透明材質(如玻璃、水、粒子效果)的Alpha混合。

  • 復雜光照模型
    自定義光照計算(如卡通著色、次表面散射)

    3. SF_Geometry(幾何著色器)

    作用:在頂點和像素著色器之間動態生成或修改圖元(如三角形、線段)。
    使用場景

  • 動態細分
    根據距離或LOD動態增加模型細節(如遠處簡化的地形近處細分)。

  • 程序化幾何生成
    從點數據生成復雜幾何體(如毛發、草地、粒子軌跡)。

  • 幾何變形
    實時切割模型或生成爆炸碎片。

  • 剔除優化
    根據條件剔除不可見圖元。

    4. SF_Compute(計算著色器)

    作用:通用GPU計算,不直接參與圖形渲染管線,通過線程組并行處理數據。
    使用場景

  • 物理模擬
    大規模粒子系統、流體動力學、布料模擬(如 Niagara GPU 粒子)。

  • 圖像處理
    實時模糊、HDR 色調映射、屏幕空間反射/折射。

  • 數據結構處理
    加速八叉樹、BVH 構建(用于光線追蹤)。

  • AI 推理
    在GPU上運行機器學習模型(如風格化濾鏡)。

    5. SF_RayGen(光線生成著色器)

    作用:光線追蹤管線的起點,定義如何生成初始光線(如相機射線、陰影射線)。
    使用場景

  • 光線追蹤反射/折射
    生成精確的鏡面反射或透明材質光線。

  • 全局光照(RTGI)
    通過追蹤間接光照路徑實現真實漫反射。

  • 陰影計算
    生成軟陰影或復雜遮擋關系的光線。

  • 體積效果
    模擬光線在霧、煙霧中的散射。

    總結與選擇指南

    著色器類型適用場景性能影響硬件要求
    SF_Vertex頂點動畫、模型變形、蒙皮網格所有平臺
    SF_Pixel材質、光照、后處理、透明度中-高所有平臺
    SF_Geometry動態細分、程序化幾何生成桌面端/高端移動端
    SF_ComputeGPU計算、物理模擬、圖像處理可變支持Compute Shader
    SF_RayGen光線追蹤反射、全局光照、復雜陰影極高RTX/AMD RDNA2+
  • 當我在藍圖調用CreateNoise
  • 流程如下:
  • 首先在library中調用接口函數,這里會轉到FNoiseSceneViewExtension里面
  • 它會自動走到這個函數(自動調用)
  • 然后調用GenerateNoise函數
  • 上面的FGenerateNoiseCSShader是在這里進行綁定的,綁定了對應的文件路徑和文件調用函數,這里調用GenerateNoiseCS.usf中的MainCS函數
  • MainCS又會調用Noise函數,最后成像
  • ScreenPassTexture FNoiseSceneViewExtension::GenerateNoise(FRDGBuilder& GraphBuilder, const FSceneView& View, const FPostProcessMaterialInputs& Inputs)
    {const FScreenPassTexture& SceneColor = FScreenPassTexture::CopyFromSlice(GraphBuilder, Inputs.GetInput(EPostProcessMaterialInput::SceneColor));FGenerateNoiseCSShader::FParameters* Parameters = GraphBuilder.AllocParameters<FGenerateNoiseCSShader::FParameters>();//這里的FGenerateNoiseCSShaderFIntPoint ScreenSize = { SceneColor.ViewRect.Width(), SceneColor.ViewRect.Height() };FRDGTextureDesc OutputDesc = FRDGTextureDesc::Create2D( ScreenSize,SceneColor.Texture->Desc.Format, FClearValueBinding::Black, TexCreate_ShaderResource | TexCreate_UAV);FRDGTextureRef OutputTex = GraphBuilder.CreateTexture(OutputDesc, TEXT("Output Texture"));Parameters->Color = FVector4f(1.f, 0.f, 0.f, 1.f);const FSceneViewFamily& ViewFamily = *View.Family;ERHIFeatureLevel::Type FeatureLevel = View.GetFeatureLevel();FGlobalShaderMap* GobalShaderMap = GetGlobalShaderMap(FeatureLevel);TShaderMapRef<FGenerateNoiseCSShader> GenerateNoiseCSShader(GobalShaderMap);Parameters->ScreenDimensions = FVector2f(ScreenSize.X, ScreenSize.Y);Parameters->Output = GraphBuilder.CreateUAV(OutputTex);FIntPoint ThreadCount = ScreenSize;FIntPoint ThreadSize = FIntPoint(8, 8);FIntVector GroupCount = FComputeShaderUtils::GetGroupCount(ThreadCount, ThreadSize);FComputeShaderUtils::AddPass(GraphBuilder, RDG_EVENT_NAME("Generate Noise"),GenerateNoiseCSShader, Parameters, GroupCount);AddCopyTexturePass(GraphBuilder, OutputTex, SceneColor.Texture);return SceneColor;
    }

    首先第一行函數聲明

  • 參數

  • GraphBuilder:RDG 的構建器,管理渲染資源的生命周期和依賴關系。

  • View:當前渲染的視圖信息(如攝像機參數、視口尺寸)。

  • Inputs:后處理階段輸入數據(如場景顏色、深度紋理)

從這里面獲取到了場景顏色信息

拿的是Inputs也就是上面文字中,后期處理階段的數據(例如場景顏色)

拿到了SceneColor

CopyFromSlice:創建紋理的副本,避免直接修改原始紋理(保證數據安全)

  • 作用:為計算著色器?FGenerateNoiseCSShader?分配參數內存。

注意觀察,下面關于FGenerateNoiseCSShader的變量都是GenerateNosiseCS.usf里面的變量

?

之后都是給這三個參數賦值!

  • FRDGTextureDesc:定義紋理屬性:

    • Create2D:創建 2D 紋理。

    • SceneColor.Texture->Desc.Format:繼承輸入紋理的格式(如 PF_A16B16G16R16)。

    • TexCreate_ShaderResource | TexCreate_UAV:允許紋理作為 Shader Resource 和 UAV(Unordered Access View)使用。

  • GraphBuilder.CreateTexture:通過 RDG 創建紋理,確保資源依賴關系正確。

  • 通過生成的紋理屬性,創建貼圖引用

?給Parameters的Color參數賦值為紅色

  • ViewFamily?和?FeatureLevel:獲取當前視圖的渲染層級(如 ES3.1、SM5、SM

  • GetGlobalShaderMap:獲取全局著色器映射,用于加載計算著色器。

?通過計算出的全局著色器映射創建hlsl實例腳本

?獲取到屏幕大小,以及通過創建的貼圖引用構建出一個可讀寫的2D貼圖紋理輸出

  • ThreadCount:總線程數(等于屏幕分辨率,例如 1920x1080)。

  • ThreadSize:單個線程組的尺寸(8x8,需與 HLSL 中的?[numthreads(8,8,1)]?一致)。

  • FComputeShaderUtils::GetGroupCount:計算線程組數量(例如?1920/8=2401080/8=135)。

  • FComputeShaderUtils::AddPass:將計算著色器任務添加到 RDG,并命名事件為 "Generate Noise"。

  • 生成需要的線程數,一個像素對應一個線程進行處理(GPU優勢就是線程多,計算快!)

  • 作用:將計算著色器的輸出紋理?OutputTex?復制回原始場景顏色紋理。

  • 細節

    • AddCopyTexturePass:通過 RDG 添加紋理復制任務,將?OutputTex?數據復制到?SceneColor.Texture


    • 現在要將屏幕中的noise消除
      這個TOptional是用來做什么的呢,其實最主要是用于非指針的類型,可以判斷非指針類型是否為空,當然虛幻也可以用于指針,舉例如下:

    • 當一個TMap內,判斷是否為空(沒有初值,但是TMap的int類型會默認賦初值為0,這個時候就沒有辦法判斷是否值被更改過,因為可能傳進來的值也有可能為0,這個時候TOptional就排上用場了,你將int包裹成TOptional<int>就可以了,如果有將值輸入進去,你就能判斷是否值被修改過,就能判斷是否為空還是非空,從而方便之后的操作

    • 第二,配置文件,當你輸入了配置文件到TOptional里面,就可以判斷非空,如果沒有配置,那么就為空

    • 這個使用場景還是很多的,合理使用,能夠幫你減少很多麻煩

?剩下就可以置空所有內容,就可以清除掉我們屏幕的效果啦!

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

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

相關文章

提示學習(Prompting)

提示學習&#xff08;Prompting&#xff09;是一種利用預訓練語言模型&#xff08;Pre-trained Language Models, PLMs&#xff09;來完成特定任務的方法。它的核心思想是通過設計特定的提示&#xff08;Prompt&#xff09;&#xff0c;將任務轉化為預訓練模型能夠理解的形式&a…

解決單元測試 mock final類報錯

文章目錄 前言解決單元測試 mock final類報錯1. 報錯原因2. 解決方案3. 示例demo4. 擴展 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0…

2025系統架構師(一考就過):案例之三:架構風格總結

軟件架構風格是描述某一特定應用領域中系統組織方式的慣用模式&#xff0c;按照軟件架構風格&#xff0c;物聯網系統屬于&#xff08; &#xff09;軟件架構風格。 A:層次型 B:事件系統 C:數據線 D:C2 答案&#xff1a;A 解析&#xff1a; 物聯網分為多個層次&#xff0…

數據如何安全“過橋”?分類分級與風險評估,守護數據流通安全

信息化高速發展&#xff0c;數據已成為企業的核心資產&#xff0c;驅動著業務決策、創新與市場競爭力。隨著數據開發利用不斷深入&#xff0c;常態化的數據流通不僅促進了信息的快速傳遞與共享&#xff0c;還能幫助企業快速響應市場變化&#xff0c;把握商業機遇&#xff0c;實…

Docker數據卷操作實戰

什么是數據卷 數據卷 是一個可供一個或多個容器使用的特殊目錄&#xff0c;它繞過 UFS&#xff0c;可以提供很多有用的特性: 數據卷 可以在容器之間共享和享用對 數據卷 的修改立馬生效對 數據卷 的更新&#xff0c;不會影響鏡像數據卷 默認會一直存在&#xff0c;即時容器被…

kafka stream對比flink

Kafka Streams 和 Apache Flink 雖然都支持實時計算&#xff0c;但它們的定位、架構和適用場景存在顯著差異。選擇哪一個取決于具體的需求、場景和技術棧。以下是兩者的核心區別和適用場景分析&#xff1a; 1. 定位與架構差異 Kafka Streams 定位&#xff1a;輕量級庫&#x…

二叉樹的先序、中序和后序 【刷題反思】

1. 已知中序和后序&#xff0c;求前序 1.1 題目 題目描述&#xff1a;給一棵二叉樹的中序和后序排列&#xff0c;求它的先序排列。 輸入描述&#xff1a;共兩行&#xff0c;均為大寫字母組成的字符串&#xff0c;分別表示一棵二叉樹的中序和后序 輸入&#xff1a;BADC BDCA…

華宇TAS應用中間件與統信最新版本操作系統完成兼容互認證

近日&#xff0c;華宇TAS應用中間件與統信服務器操作系統經過技術迭代與優化&#xff0c;在原先UOS V20的基礎上完成了UOS V25的兼容互認證。此次認證涵蓋了眾多主流的國產CPU平臺&#xff0c;包括鯤鵬920、飛騰FT2000/64、飛騰騰云S2500等。 經過嚴格測試&#xff0c;雙方產品…

Docker 搭建 Redis 數據庫

Docker 搭建 Redis 數據庫 前言一、準備工作二、創建 Redis 容器的目錄結構三、啟動 Redis 容器1. 通過 redis.conf 配置文件設置密碼2. 通過 Docker 命令中的 requirepass 參數設置密碼 四、Host 網絡模式與 Port 映射模式五、檢查 Redis 容器狀態六、訪問 Redis 服務總結 前言…

35. Spring Boot 2.1.3.RELEASE 應用監控【監控信息可視化】

在 Spring Boot 2.1.3.RELEASE 中實現監控信息可視化可以通過多種方式&#xff0c;下面為你詳細介紹使用 Spring Boot Actuator 結合 Grafana 和 Prometheus 以及使用 Spring Boot Admin 這兩種常見方法。 方法一&#xff1a;Spring Boot Actuator Grafana Prometheus 1. 添…

服務器間遷移conda環境

注意&#xff1a;可使用遷移miniconda文件 or 遷移yaml文件兩種方式&#xff0c;推薦前者&#xff0c;基本無bug&#xff01; 一、遷移miniconda文件&#xff1a; 拷貝舊機器的miniconda文件文件到新機器: 內網拷貝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…

在VSCode中安裝jupyter跑.ipynb格式文件

個人用vs用的較多&#xff0c;不習慣在瀏覽器單獨打開jupyter&#xff0c;看著不舒服&#xff0c;直接上教程。 1、在你的環境中pip install ipykernel 2、在vscode的插件中安裝jupyter擴展 3、安裝擴展后&#xff0c;打開一個ipynb文件&#xff0c;并且在頁面右上角配置內核 …

20250223下載并制作RTX2080Ti顯卡的顯存的測試工具mats

20250223下載并制作RTX2080Ti顯卡的顯存的測試工具mats 2025/2/23 23:23 緣起&#xff1a;我使用X99的主板&#xff0c;使用二手的RTX2080Ti顯卡【顯存22GB版本&#xff0c;準備學習AI的】 但是半年后發現看大碼率的視頻容易花屏&#xff0c;最初以為是WIN10經常更換顯卡/來回更…

WordPress R+L Carrier Edition sql注入漏洞復現(CVE-2024-13481)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x0…

深入了解 NAT 模式:網絡地址轉換的奧秘

深入了解 NAT 模式&#xff1a;網絡地址轉換的奧秘 在計算機網絡的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;扮演著至關重要的角色。它就像是網絡中的翻譯官&#xff0c;在不同網絡地址之間進行轉換&#xff0…

Git版本控制系統---本地操作(萬字詳解!)

目錄 git基本配置 認識工作區、暫存區、版本庫 添加文件--情況一&#xff1a; 添加文件-情況二: 修改文件: 版本回退&#xff1a; git基本配置 1.初始化本地倉庫&#xff0c;注意&#xff1a;一定要在一個目錄下進行&#xff0c;一般都是新建一個文件夾&#xff0c;在文件…

Jupyter Notebook切換虛擬環境(Kernel管理)

我們在使用Jupyter Notebook的時候&#xff0c;打開文件發現只有一個Python3(ipykernel)&#xff0c;我們自己在conda中創建的虛擬環境為什么沒有顯示出來&#xff0c;今天我就來和大家一起討論一下&#xff01; 在 Jupyter Notebook 中&#xff0c;kernel 是執行代碼的核心。管…

【網絡安全】常見的web攻擊

1、SQL注入攻擊 定義&#xff1a; 攻擊者在HTTP請求中注入惡意的SQL代碼&#xff0c;當服務器利用參數構建SQL語句的時候&#xff0c;惡意的SQL代碼被一起構建,并在數據庫中執行。 示例&#xff1a; 用戶登錄&#xff1a; 輸入用戶名xx&#xff0c; 密碼 or 1 …

Java基礎關鍵_012_包裝類

目 錄 一、基本數據類型對應的包裝類 1.概覽 2.說明 二、包裝類 1.最大值與最小值 2.構造方法 3.常用方法&#xff08;Integer為例&#xff09; &#xff08;1&#xff09;compare(int x, int y) &#xff08;2&#xff09;max(int a, int b) 和 min(int a, int b) &…

MacPorts 創建自定義 Portfile 安裝 RoadRunner

Portfile 放 ~/Ports/net/roadrunner-server 下&#xff1a; # -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fencutf-8:fttcl:et:sw4:ts4:sts4PortSystem 1.0name roadrunner-server version 202…