目前,我正在学习DirectX 12极限版中的DXR实时射线跟踪的基础知识。我正在研究官方的D3D12射线追踪样本,我正在使用i9/Intel / the 3070笔记本电脑,并在VS2022中构建程序。
由于这些示例是为Windows 10编写的,而且我使用的是混合图形PC,所以在设备创建期间将D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE
添加到Windows 11之后,调试构建将在Windows 11中运行(参见DirectX 12 application is crashing in Windows 11)。唯一的问题是,在按Alt+Enter键组合时,没有一个示例程序更改为全屏(即无边界窗口)模式。程序总是处于窗口模式。
到目前为止,这并没有让我担心,因为我一直在将光线跟踪代码复制到一个模板(基于DirectX工具包的Windows桌面),在那里全屏切换工作正常。通过这种方式,我能够在窗口模式和全屏(2560x1440监视器分辨率)中成功地运行HelloWorld和SimpleLighting示例。
但是,对于引入交叉着色的ProceduralGeometry示例来说,这还不是很成功。再一次,原始示例程序正确地呈现场景,但只在一个边缘窗口中。但是当代码在模板中被复制时,我可以切换到全屏幕,光线跟踪的场景不能正确地呈现。
在场景中,用于场景地面的三角形几何图形呈现为ok,但在分形金字塔周围的半透明包围框是可见的,所有其他的过程几何也呈现半透明。每隔几秒钟,元宝库的包围盒也会短暂出现,然后消失。
我能够确定,通过冻结场景,出现半透明的原因是下列帧是按顺序呈现的:
box
在本机框架(在我的机器上165赫兹),这导致过程几何和包围框始终可见,但“看穿”,因为所有的部分完整的帧显示。这发生在窗口模式和全屏模式中,但在全屏模式下更糟糕,因为场景会受到窗口模式中看不到的随机图像损坏的影响。
几天来我一直在努力解决这个问题,但没能解决这个问题。我对示例程序所做的唯一更改是Windows 11修复,并使用模板进行正确的全屏呈现,原始示例忽略或没有正确实现。
希望有人能对这个令人困惑的问题有所了解!
发布于 2022-06-29 16:17:04
我发现了问题。每个示例都有一个名为DXSampleHelper.h的头文件。对于ProceduralGeometry示例,这个头文件被更新为一个帮助类来管理结构化缓冲区,这非常类似于常量缓冲区的助手类。
CopyStagingToGpu()方法由两个类中的一行memcpy操作组成,与结构化缓冲区类略有不同:
memcpy(m_mappedBuffers + instanceIndex * NumElementsPerInstance(), &m_staging[0], InstanceSize());
常量缓冲区类中的相同方法是:
memcpy(m_mappedBuffers + instanceIndex, &m_staging[0], InstanceSize());
也就是说,我缺少了instanceIndex * NumElementsPerInstance()
,因此结构化缓冲区中的过程几何实例在GPU内存中没有正确地对齐。
https://stackoverflow.com/questions/72767023
复制相似问题