D3D12 DXR光线追踪示例全屏失效及ProceduralGeometry渲染异常
DXR ProceduralGeometry示例迁移后程序化几何体半透明、帧提交异常问题排查
环境说明
- 开发环境:VS2022
- 硬件设备:搭载i9处理器、Intel Iris Xe核显、RTX3070独显的笔记本电脑,原生屏幕刷新率165Hz,分辨率2560x1440
- 系统版本:Windows 11
- 研究内容:DirectX 12 Ultimate DXR API实时光线追踪基础技术,基于官方GitHub仓库的D3D12光线追踪示例开展调试
前置适配情况
官方D3D12光线追踪示例原生面向Windows 10开发,在混合显卡架构的Windows 11设备上存在兼容性问题。我在创建设备阶段向D3D12_INFO_QUEUE_FILTER中添加D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE过滤项后,Debug构建版本可正常启动运行,但存在原生功能缺陷:所有示例均不支持Alt+Enter触发全屏(无边框窗口)切换,始终保持窗口化运行。
此前我通过将光线追踪代码迁移至基于Windows桌面版DirectX Tool Kit开发的自定义模板(该模板已正确实现全屏切换逻辑)解决全屏问题,已成功在窗口化、全屏两种模式下正常运行HelloWorld、SimpleLighting两个基础示例。
故障表现
迁移引入交集着色器的ProceduralGeometry示例时出现渲染异常:
- 原生示例在带边框窗口模式下可正常渲染全场景
- 代码迁移至支持全屏的模板后,三角形地平面可正常渲染,但分形金字塔外围显示半透明包围盒,其余所有程序化几何体均呈现半透明效果;元球(metaballs)包围盒每隔数秒短暂闪现后消失
- 该异常在窗口化、全屏模式下均存在,全屏模式下故障程度更严重,会额外出现窗口化模式下不存在的随机画面损坏现象
通过冻结场景逐帧排查,已确认半透明效果的直接成因:显示端按顺序提交了未完成渲染的中间帧,帧序列如下:
- 仅包含三角形地平面四边形的帧
- 包含地平面几何体、不透明分形金字塔包围盒的帧
- 包含地平面、分形金字塔包围盒、不透明元球包围盒的帧
- 包含所有不透明几何体、无包围盒的完整渲染帧
在165Hz原生刷新率下,未完成渲染的中间帧全部被提交到显示端,导致程序化几何体和包围盒始终可见,叠加后呈现半透明“透视”效果。
已做修改与排查进展
我对官方示例仅做了两处修改:
- 添加前述Windows 11兼容性消息过滤项
- 将渲染逻辑接入已验证可正常实现全屏渲染的自定义模板(官方原生示例未实现、也未考虑全屏渲染逻辑)
目前已排查多日未定位根因,寻求有相关DXR开发经验的技术人员提供排查思路与解决方案。
内容的提问来源于stack exchange,提问作者Maico De Blasio
相关产品推荐
相关产品推荐

