123456835 发表于 2020-12-31 10:39

【UE4.26.0】一个截帧问题的记录与解决方法

事情是这样的,作为UE新手编译UE4.26后想打个包,截帧看一下OpenGL下的移动管线是如何执行的。毕竟Editor模式下还是用D3D11模拟的移动管线。但是在这个过程中却遇到了不少问题。在组内大佬帮助下终于成功截了一张没有问题的一帧,下面记录一下。整个过程还是很有意思的。
问题出现:
一般的在打包出来的exe文件后面加入如下的命令
-opengl -FeatureLevelES31 –noailogging就会启动OpenGL的方式进行渲染。但是这次却给我报了如下的错误。




问题分析:
首先在UnrealEngine-4.26\Engine\Binaries\Win64目录中找到UnrealPak.exe。使用命令行窗口执行:
UnrealPak.exe “打包后Content\Paks\pak文件” –Extract “目标路径”这样就能得到包体解压后的文件。打开解压文件后,发现只有与D3D相关的shader:


所以错误提示中缺少global shader正是与OpenGL有关的shader。用OpenGL模式启动程序当然会报错。
解决方法:
为了解决这个问题,需要在项目中的DefaultEngine.ini中加上如下的设置:

+TargetedRHIs=GLSL_150_ES31重新打包后,再解压就会发现多出了与OpenGL相关的shader:
与shader相关的问题得到解决。
问题再次出现:
但是问题并没有解决,如果直接去执行exe文件又会出现新的错误:


发现是奔溃到了引擎中的一行。还好Unreal是开源的。那么就开启Debug模式去追踪一下到底是哪里出现了问题。
问题分析与解决:
选取Debug模式,在项目命令参数那行加上:
-basedir=F:\Package\WindowsNoEditor\LearnUnreal\Binaries\Win64 -opengl -FeatureLevelES31当然我这个包是这个路径,如果你也遇到了这个问题就要换成你自己的路径。
启用Debug模式后,编译执行后可能会提示缺少一些第三方文件。我这里就是提示缺少了PhysX3。从引擎中的Engine\Binaries\ThirdParty找到PhysX3拷贝到包文件中与之对应的地方。
然后再执行,会奔溃到OpenGLDevice.cpp这里:
而这个和computer shader有关的地方其实是没有被开启的:
所以直接注释掉,或者利用宏设置为在windows平台不执行即可:
另一个问题分析与解决:
再次执行Debug模式,屏幕一黑一闪,又崩溃到了另一个地方:
但是看调用堆栈,实际上问题出现在了RenderScene.cpp这里:
发现是和路径追踪有关的变量。然而我这个项目并没有开启光追模式,所以走到这里也是令人匪夷所思。
直接注释掉这一行,当然与之对应析构的地方也要注释掉。随后就可以尝试使用Render Doc进行截帧。
最后被Render Doc v1.11坑了:
但是在用Render Doc v1.11进行截帧的时候会出现如下的报错:




而933行是这么个内容:
我猜测可能在截帧的时候破坏了OpenGL的一些状态,导致的这个报错。即便注释掉这一块,还是会崩到别得地方。
但是再看Render Doc v1.11已经截到了。然而最后的图还是有点问题:
经过我多次测试,发现只要视野中有动态阴影的物体。图片就会呈这种黑块状。
最后换到老版本的Render Doc v1.5截了一帧,也没崩溃截出来的图也是好的:
问题至此终于解决。
虽然截帧是一个非常基础的操作,但是我在这个过程还是掌握到了不少东西。如果有人发现是我食用UE4.26的方法不对的话,欢迎在评论区指出。
页: [1]
查看完整版本: 【UE4.26.0】一个截帧问题的记录与解决方法