首先這里是綁定.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_Compute GPU計算、物理模擬、圖像處理 可變 支持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=240
,1080/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里面,就可以判斷非空,如果沒有配置,那么就為空
-
這個使用場景還是很多的,合理使用,能夠幫你減少很多麻煩
-
-
?剩下就可以置空所有內容,就可以清除掉我們屏幕的效果啦!