全屏模式在D3D12光线追踪样本中不工作



目前我正在学习DirectX 12 Ultimate中的DXR API实时光线追踪的基础知识。我正在官方GitHub上研究D3D12光线追踪样本,并使用i9/Intel Iris Xe/RTX3070笔记本电脑,并在VS2022中构建程序。

由于示例是为Windows 10编写的,我使用的是混合图形PC,在将D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE添加到D3D12_INFO_QUEUE_FILTER后,调试构建将在Windows 11中运行。在设备创建过程中(参见DirectX 12应用程序在Windows 11中崩溃)。唯一的问题是,当按下Alt+Enter组合键时,没有一个示例程序更改为全屏(即无边界窗口)模式。程序始终保持在窗口模式

到目前为止,这并没有让我担心,因为我已经将光线追踪代码复制到一个模板(基于Windows桌面的DirectX工具包),其中全屏切换正常工作。通过这种方式,我能够在窗口模式和全屏(2560x1440显示器分辨率)下成功运行HelloWorldsimplellighting示例。

然而,对于proceuralgeometry样本来说,这并不是那么成功,它引入了交叉着色器。同样,原始示例程序正确地渲染了场景,但仅在有边框的窗口中。但是当代码在模板中复制时,我可以切换到全屏,光线追踪场景不能正确渲染。

在场景中,用于场景地平面的三角形几何体渲染正常,但分形金字塔周围的半透明边界框是可见的,所有其他程序几何体也呈现半透明。每隔几秒钟,元球的边界框也会短暂出现,然后消失。

我能够确定,通过冻结场景,半透明的原因是以下帧被依次呈现:

  • 三角形地平面四边形
  • 地板几何加上不透明的分形金字塔边界框
  • 以上所有加上不透明元球边界框
  • 不透明几何体和无边界框完成场景

在原生帧率下(在我的机器上是165Hz),这会导致程序几何和边界框始终可见,但由于所有部分完成的帧都呈现在显示器上,因此是"透明的"。这在窗口和全屏模式下都会发生,但在全屏模式下情况更糟,因为场景会受到随机图像损坏的影响,而在窗口模式下是看不到的。

这个问题我已经纠结了好几天了,还是没有解决。我对示例程序所做的唯一更改是Windows 11的修复,并使用正确的全屏渲染模板,原始示例忽略或没有正确实现。

希望有人能阐明这个令人困惑的问题!

我找到问题了。每个示例都有一个名为DXSampleHelper.h的头文件。对于proceuralgeometry示例,这个头文件被更新为一个帮助类来管理结构化缓冲区,这与常量缓冲区的帮助类非常相似。

CopyStagingToGpu()方法由两个类中的一行memcpy操作组成,对于结构化缓冲类略有不同:
memcpy(m_mappedBuffers + instanceIndex * NumElementsPerInstance(), &m_staging[0], InstanceSize());

在常量缓冲类中,同样的方法是:
memcpy(m_mappedBuffers + instanceIndex, &m_staging[0], InstanceSize());

。我缺少instanceIndex * NumElementsPerInstance(),因此结构化缓冲区内的过程几何实例在GPU内存中没有正确对齐。

最新更新