文章目录
- O 前言
- 1 UE5源码编译和往一个空项目加模块
- 2 使用UE实现Global Compute Shader
- 2.1 基本概念
- 2.2 游戏模块“xxx”加载后无法被成功初始化
- 2.3 Shader type was loaded after engine init, use ELoadingPhase::PostConfigInit on your module to cause it to load earlier.已在 UnrealEditor.exe 中执行断点指令(__debugbreak()语句或类似调用)。
- 2.4 warning: Group size of 262144 (64 * 64 * 64) is outside of valid range [1..1024] - attribute will be ignorederror: compute entry point must have a valid numthreads attribute启动时黑屏
- 3 使用UE实现Global VS/PS
O 前言
腾讯游戏远程实践课题一
1 UE5源码编译和往一个空项目加模块
第一次作业–这个引擎我已经编译不下8次了,搞了三四天,一直反复编译。
现在成功的那一刻,眼泪憋不住了嘤嘤嘤
1.1UE引擎编译成功,但是每次打开项目会要求重新编译?
解决办法:无论是项目还是引擎,都不要碰rebuild和clean!
这里虽然是仅用于项目,但是按下去就啥也没了整个引擎得重新花一小时编译!(项目编译不通过二重奏 :查日志,全网搜; 不要老是编译)
1.2 无法解析的外部符号MSB3073代码6错误
无法解析的外部符号 "__declspec(dllimport) void __cdecl AddShaderSourceDirectoryMapping(class FString const &,class FString const &)" (__imp_?AddShaderSourceDirectoryMapping@@YAXAEBVFString@@0@Z),函数 "private: virtual void __cdecl FExampleComputeShaderModule::StartupModule(void)" (?StartupModule@FExampleComputeShaderModule@@EEAAXXZ) 中引用了该符号啥外部符号不能解析‘
这个函数(AddShaderSourceDirectoryMapping)来自 ShaderCore 模块,但你的项目可能没有正确引用该模块。或者,你的 Unreal Engine 版本中,AddShaderSourceDirectoryMapping 的定义已被移动到其他模块,例如 RenderCore 或 RHI。
修复方法:
在 项目模块名.Build.cs 文件中,加入RenderCore 模块在 PrivateDependencyModuleNames 或 PublicDependencyModuleNames 中声明。例如:
csharp
PrivateDependencyModuleNames.AddRange(new string[] { "Core", "RenderCore", "RHI" });
1.3pending:反复编译引擎内存节节高升?
安在D盘,第一次编译引擎成功后我的内存还有295GB,经过反复重新编译后,内存由295->256->186;我不知道啥原因,之后找个机会卸载一下试试。
项目编译永远不要clean和rebuild!!!
2 使用UE实现Global Compute Shader
在 Unreal Engine(UE)中实现全局计算着色器(Global Compute Shader),需要深入了解 UE 的渲染流水线以及如何通过 RHI
(Rendering Hardware Interface)与计算着色器交互。这是一项高级功能,主要涉及 HLSL 编写、UE 的 C++ 模块开发以及 GPU 数据的传输。
2.1 基本概念
- 计算着色器(Compute Shader) 是一种运行在 GPU 上的程序,用于处理不涉及图形渲染的任务,例如物理模拟、粒子系统、数据处理等。
- 在 UE 中,计算着色器通过
RenderCore
模块和RHI
API 进行集成。
全局计算着色器的实现主要分为以下几步:
- 编写 HLSL 计算着色器代码。
- 在 UE 中封装 HLSL 逻辑(通过 C++ 代码与引擎交互)。
- 配置渲染管线(包括 Shader 参数绑定、执行等)。
- 在项目中调用计算着色器。
2.2 游戏模块“xxx”加载后无法被成功初始化
解决:请教大佬说检查一下IMPLEMENT_MODULE宏有没有写,发现没写,加上:
IMPLEMENT_MODULE(FShaderFunctionLibraryModule, FShaderFunctionLibrary)
2.3 Shader type was loaded after engine init, use ELoadingPhase::PostConfigInit on your module to cause it to load earlier.已在 UnrealEditor.exe 中执行断点指令(__debugbreak()语句或类似调用)。
解决:在项目的.uproject文件里面模块定义改成PostConfigInit
2.4 warning: Group size of 262144 (64 * 64 * 64) is outside of valid range [1…1024] - attribute will be ignorederror: compute entry point must have a valid numthreads attribute启动时黑屏
解决:修改.usf文件使得线程数减小
3 使用UE实现Global VS/PS
3.1Could not find definition for module ‘ExampleGraphicsShader’
解决:在ShaderFunctionLibraryModule.h引入#include "ExampleGraphicsShaderModule.h" // 确保路径正确
3.2矩阵变换时候颜色渲染不出来
解决:需要对齐参数。排查的时候可以直接传入常数测试,然后打印变换矩阵验证追踪bug。
对齐:
定义使用FMatrix44f ,矩阵取行使用.M。
3.33 Shader compiler errors compiling global shaders for platform PCD3D_SM6:
Shader debug info dumped to: “D:\unreal_project\project1\Saved\ShaderDebugInfo\PCD3D_SM6\Global\FExampleGraphcisShaderVS\0”
D:\unreal_project\project1\Shaders\ExampleGraphicsShader.usf(0): Shader FExampleGraphcisShaderVS, Permutation 0, VF None:
error: validation errors
D:\unreal_project\project1\Shaders\ExampleGraphicsShader.usf(0): Shader FExampleGraphcisShaderVS, Permutation 0, VF None:
error: Semantic ‘ATTRIBUTE’ overlap at 4.
D:\unreal_project\project1\Shaders\ExampleGraphicsShader.usf(0): Shader FExampleGraphcisShaderVS, Permutation 0, VF None:
Validation failed.
Retry compilation?
解决: 参数顺序 ,新加的参数要放在变换矩阵前面。因为transform矩阵传入分成多行,如果在后面加参数会占用属性所以造成冲突。但是老师说更好的办法是传入shader参数。