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命令)来发起和执行的。

相关推荐
日月云棠2 小时前
UE5 Lyra源码分析——Audio_Analysis音频模块全面分析
ue5·音视频
成都渲染101云渲染66664 小时前
2026云渲染平台哪个好?建筑、动画、UE5项目选择云渲染的3个关键标准
ue5
清泓y1 天前
UE 物理系统知识分享
面试·ue5·游戏程序
清泓y1 天前
UE移动开发技术面试题
android·面试·ue5·ue4·游戏程序
清泓y1 天前
UE基础知识与引擎架构面试题
面试·架构·ue5·ue4·游戏程序
mengzhi啊3 天前
UE5关卡切换 传统加载(阻塞)vs流式加载(非阻塞)。还有加载关卡3种办法
ue5
电子云与长程纠缠3 天前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎
Duo1J5 天前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
directx3d_beginner6 天前
26,怪物受击接口改为C++
ue5
远离UE48 天前
UE5 UV邻接 Niagara潜水模拟 学习笔记
ue5·uv