UE5 Computer Shader 概念整理

复制代码
class FGlobalShader : public FShader
{
	DECLARE_EXPORTED_TYPE_LAYOUT(FGlobalShader, RENDERCORE_API, NonVirtual);
复制代码
DECLARE_EXPORTED_TYPE_LAYOUT

核心作用与解决的问题

在UE5的渲染管线中,尤其是在编写自定义Pass(如后处理、GPU计算)时,你经常需要定义一个结构体(例如 FMyShaderParameters)来封装着色器参数。这个结构体会在两个地方使用:

  1. C++ 端:用于准备和设置参数数据。

  2. HLSL 着色器端:用于接收和使用这些参数。

DECLARE_EXPORTED_TYPE_LAYOUT 解决的关键问题是:当这个结构体在多个不同的着色器文件中被 #include 引用 时,如何保证它在所有地方都被编译器视为完全相同的类型 ,拥有完全一致的内存对齐和偏移。如果不一致,C++端传递的数据就会与GPU端读取的数据错位,导致渲染错误或程序崩溃。

1. 内存对齐:存放规则

对齐 就是数据存放的起始地址必须满足的"规则"。这个规则通常是数据自身大小的整数倍。

  • 为什么要有这个规则? 这是硬件(CPU/GPU)的强制要求。现代处理器从内存中读写数据,并不是一次1个字节,而是像4字节8字节16字节这样的"块"。如果一个4字节的int起始地址是4的倍数,那么它正好落在一个或两个对齐的"块"内,一次操作就能完成读写,这被称为"对齐访问"。如果它起始于一个不对齐的地址(比如地址5),那么它可能横跨两个内存块,需要两次内存操作、额外的移位和拼接,效率极低。在某些架构(如许多GPU)上,不对齐访问甚至会导致程序错误或崩溃。

2. 内存偏移:位置坐标

偏移 是指在某个结构体或数据块内部,某个特定成员距离起始位置的"距离"(以字节为单位)。

  • 在前面的"对齐存放"例子中:

    • 整个结构体的起始地址是 0

    • 第一个int的偏移是 0(从起始位置开始)。

    • bool的偏移是 4(因为前面的int占了0,1,2,3四个柜子)。

    • 第二个int的偏移是 8(因为bool占了柜子4,而5、6、7是为了满足"对齐规则"必须空出的"空闲"柜子)。





RDG(Rendering Dependency Graph 渲染依赖图) 相当于提前拥有整个剧本,在GPU运行之前就已经知道剧本,且PSO的部分只是剧本中的一环,RDG是一个"渲染通道"(Pass)

RDG管理的是一帧内所有Pass的"调度、依赖和资源",但Pass内部具体的"渲染操作指令"(如设置PSO、发起DrawCall)并不由RDG直接定义或包含。


一次DrawCall(绘制调用)是由一个特定的RHICommand(RHI命令)来发起和执行的。

相关推荐
朗迹 - 张伟3 小时前
UE5 C++学习笔记
c++·学习·ue5
成都渲染101云渲染66665 小时前
C4D/Blender云渲染计费详解|5090显卡实测:速度对比+成本核算
3d·ue5·blender·maya·houdini
朗迹 - 张伟1 天前
UE5 UMG学习笔记
笔记·学习·ue5
平行云1 天前
数字孪生信创云渲染系列(一):混合信创与全国产化架构
unity·ue5·3dsmax·webgl·gpu算力·实时云渲染·像素流送
吴梓穆2 天前
UE5手动放置的树有碰撞,地形刷出来的没有
ue5
Zhichao_972 天前
【UE UMG 材质】虚线框
ue5·材质
朗迹 - 张伟3 天前
UE5.7 基础入门学习笔记
笔记·学习·ue5
朗迹 - 张伟4 天前
UE5 Road Creator Pro 插件学习笔记
笔记·学习·ue5
avi91117 天前
UnReal-UE5虚幻蓝图如何修改
ue5·游戏引擎·虚幻·虚幻引擎·ue·蓝图·蓝图逻辑
郝学胜-神的一滴8 天前
系统设计与面向对象设计:两大设计思想的深度剖析
java·前端·c++·ue5·软件工程