首先这里是绑定.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里面,就可以判断非空,如果没有配置,那么就为空
-
这个使用场景还是很多的,合理使用,能够帮你减少很多麻烦
-
-
剩下就可以置空所有内容,就可以清除掉我们屏幕的效果啦!