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_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>();//这里的FGenerateNoiseCSShader
  	FIntPoint 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里面,就可以判断非空,如果没有配置,那么就为空

    • 这个使用场景还是很多的,合理使用,能够帮你减少很多麻烦

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

相关推荐
Rabitebla9 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
小lu飞10 小时前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水14 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd14 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao17 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李17 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga19 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd19 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白20 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李21 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议