UE5 Computer Shader学习笔记

news/2025/2/26 8:57:10

首先这里是绑定.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>();//这里的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=2401080/8=135)。

  • FComputeShaderUtils::AddPass:将计算着色器任务添加到 RDG,并命名事件为 "Generate Noise"。

  • 生成需要的线程数,一个像素对应一个线程进行处理(GPU优势就是线程多,计算快!)

  • 作用:将计算着色器的输出纹理 OutputTex 复制回原始场景颜色纹理。

  • 细节

    • AddCopyTexturePass:通过 RDG 添加纹理复制任务,将 OutputTex 数据复制到 SceneColor.Texture


http://www.niftyadmin.cn/n/5868433.html

相关文章

Spring 原始注解详解与实战指南

&#x1f4dd; 1. 前言 在 Spring 框架的发展过程中&#xff0c;注解的引入大大简化了配置&#xff0c;提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解&#xff0c;包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等&#xff0c;…

面试之《react近几个版本的更新要点》

React 16.x 系列 React 16.0 Fiber 架构&#xff1a;引入了全新的 Fiber 协调器&#xff0c;解决了旧版同步渲染长时间阻塞主线程的问题&#xff0c;实现了异步可中断渲染、优先级调度、时间分片等特性&#xff0c;大大提升了大型应用的性能和响应能力。 新的错误边界&#x…

【愚公系列】《Python网络爬虫从入门到精通》033-DataFrame的数据排序

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01&#xff1a;PHP 序列化 — Serialize 序列化就是将对象的状态信息转化为可以存储或传输的形式的过程&#xff0c;在 PHP 中&#xff0c;通常使用 serialize() 函数来完成序列化的操作…

React七Formik

Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理&#xff0c;表单验证以及表单提交。Formik支持React中的所有表单元素和事件&#xff0c;可以很好地与React生态系统中的其他库集成。同时&#xff0c;Formik还提供了一些高级功能&#xf…

github 推送的常见问题以及解决

文章目录 git add 的时候问题1为什么会发生这种情况&#xff1f;Git 的警告含义如何解决&#xff1f;1. **保持 Git 的默认行为&#xff08;推荐&#xff09;**2. **禁用自动转换**3. **仅在工作目录中禁用转换**4. **统一使用 LF&#xff08;跨平台开发推荐&#xff09;** git…

2.25力扣每日一题--设计内存分配器

2502. 设计内存分配器 - 力扣&#xff08;LeetCode&#xff09; 一&#xff1a;JAVA Allocator(int n)函数&#xff1a;类构造器 int allocate(int size, int mID)函数&#xff1a;输入&#xff0c;待插入块的大小size,插入内容mid / 输出&#xff0c;插入位置块的起始位置…

【redis】数据类型之Bitfields

Redis的Bitfields&#xff08;位域&#xff09;与Bitmaps一样&#xff0c;在Redis中并不是一种独立的数据类型&#xff0c;而是一种基于字符串的数据结构&#xff0c;用于处理位级别的操作。允许用户将一个Redis字符串视作由一系列二进制位组成的数组&#xff0c;并对这些位进行…