ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DirectX-Graphics-Samples 之 Sakura Forest SER 示例:用 Shader Execution Reordering 提升光线追踪执行效率

DirectX-Graphics-Samples 之 Sakura Forest SER 示例:用 Shader Execution Reordering 提升光线追踪执行效率 示例工程【免费下载链接】DirectX-Graphics-SamplesThis repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.项目地址https://gitcode.com/gh_mirrors/di/DirectX-Graphics-Samples点击查看免费下载导读本文深入剖析 DirectX-Graphics-Samples 仓库中 D3D12RaytracingSakuraForestSER 示例它以一座风格化的樱花森林场景为舞台演示了 DirectX 12 Shader Execution ReorderingSER如何通过MaybeReorderThread()给 GPU 提供线程分组提示从而提升光线追踪着色阶段的执行效率。读完本文你将掌握该示例的场景构成、三种 SER 排序模式的底层实现按 HitObject、按 reflectHint、按两者结合、reflectHint 的纹理采样推导逻辑以及完整的运行参数、界面信息与键盘操作方式。一、SER 是什么为什么樱花森林需要它在光线追踪中一束主光线命中不同几何体后会进入各自对应的着色器执行路径。当相邻线程执行的着色负载差异极大时例如有的线程只做简单的漫反射计算有的线程却要递归追踪反射光线GPU 上会出现显著的执行效率损失。Shader Execution ReorderingSER允许开发者在射线着色阶段通过MaybeReorderThread()主动提供排序提示让 GPU 硬件把执行路径相似、负载接近的线程重新分组调度从而减少分支发散与资源占用波动。该示例正是把 SER 应用在了一座复杂场景中樱花森林由树干trunk、花瓣leaves、灌木bush与地板立方体等多种几何类型组成天然存在着色负载差异是演示 SER 收益的理想场景。二、场景构成13525 个顶层实例的源码级拆解从 D3D12RaytracingSakuraForestSER.h 可以看到场景总计numTopLevelInstances 13525个顶层加速结构实例在 D3D12RaytracingSakuraForestSER.cpp 的BuildAccelerationStructures()中实例由四类几何 程序化布局组合而成几何类型数量近似布局方式着色负载特征地板大立方体44120×20 网格间距 4.0、缩放 2.0纹理采样 暗区触发反射随机反射小立方体96130×30 网格间距 0.1、随机高度偏移始终追踪反射光线Fresnel树干96130×30 网格间距 1.9 随机偏移三平面映射纹理采样树冠花瓣961与树干同位置关闭三角形剔除三种粉色系颜色 漫反射灌木10201100×100 网格间距 0.2 随机偏移UV 纹理采样 漫反射值得注意的源码细节地板与反射立方体共用同一个 cube BLASm_bottomLevelAccelerationStructureCube通过 shader table 中不同的 hit group 记录区分materialID 0走地板着色器materialID 1走反射立方体着色器花瓣实例设置了D3D12_RAYTRACING_INSTANCE_FLAG_TRIANGLE_CULL_DISABLED3D12RaytracingSakuraForestSER.cpp保证薄片状花瓣双面可见随机偏移使用固定种子seed 42的std::mt19937确保每次运行植被分布确定、可复现场景光照参数在InitializeScene()中设定环境光(0.8, 0.8, 0.8)、漫反射光(1.2, 1.0, 1.0)光源位于(0, 15.8, 233)并绕 Y 轴旋转周期 8 秒。三、三种 SER 排序模式HitObject、reflectHint 与 BothSER 排序模式的切换由场景常量缓冲中的sortMode驱动。该枚举定义于 RayTracingHlslCompat.henum SortMode { SORTMODE_OFF 0, SORTMODE_BY_HIT 1, SORTMODE_BY_MATERIAL 2, SORTMODE_BY_BOTH 3 };在 Raytracing.hlsl 的ApplyThreadReordering()中三种模式分别对应三种dx::MaybeReorderThread调用形式模式排序依据HLSL 调用Sort by HitObject命中对象HitObject本身dx::MaybeReorderThread(hit)Sort by reflectHint自定义反射提示键dx::MaybeReorderThread(hint, numHintBits)1 位Sort by Both两者组合dx::MaybeReorderThread(hit, hint, numHintBits)射线生成阶段MyRaygenShader的完整逻辑是当sortMode SORTMODE_OFF时走传统TraceRay()否则使用HitObject::TraceRay()创建命中对象随后计算 reflectHint 并调用ApplyThreadReordering()最后通过HitObject::Invoke(hit, payload)执行命中着色器。这正是 SER 的核心流程——先排序、再执行。四、reflectHint 的推导用地板纹理采样识别水面reflectHint是示例中一个为演示 SER 排序属性而引入的自定义键实现于 Raytracing.hlsl 的ComputeReflectionHint()仅在SORTMODE_BY_MATERIAL或SORTMODE_BY_BOTH模式下计算且hit.IsMiss()时直接返回 0通过hit.LoadLocalRootTableConstant(16)读取材质 IDmaterialID 0地板按射线参数方程估算命中点estimatedHit origin t * rayDir地板高度为 2取frac(estimatedHit.xz)作为 UV采样树干纹理若rgb三个分量均小于 0.1足够暗判定为反射性区域hint 1materialID 1反射立方体恒为hint 1该 hint 用 1 个 bit 编码供MaybeReorderThread作为排序键。反射行为本身在FloorClosestHitShader中实现当采样颜色足够暗且未达递归上限时追踪一条反射光线并用 Schlick 近似计算 Fresnel 反射率将反射色与基色按 Fresnel 混合lerp(baseColor, reflectionColor.rgb, fresnel) * 1.7f。这套机制在着色区域内模拟出浅浅的水洼效果——暗色缝隙像水面一样产生镜面反射与空间中随机散布的反射小立方体相呼应。五、天空盒的重负载设计与不同硬件的实测观察readme 特别强调了一个关键设计点该场景对天空盒施加了重负载使其比典型游戏场景中的天空盒昂贵得多这正是 SER 收益的主要来源。这一说法在源码中有充分依据。Star.hlsli 实现了Star Nest体素分形云特效每个 miss 像素要执行200 个采样步 × 50 次分形迭代的循环共约 1 万次迭代计算。当视点透过树冠缝隙看到天空时不同像素的着色成本差异极大——有的像素命中树干/灌木只做简单着色有的像素 miss 后陷入 1 万次迭代的分形计算。这种极端可变性正是 SER 发挥作用的典型场景。readme 记录的实测观察原文结论非本文推测引入基于reflectHint的MaybeReorderThread()是为了演示另一个可排序的属性反射远比简单光照计算昂贵在该示例的测试中此属性在RTX 5070上收益甚微但在架构较旧的高端 GPU如RTX 4080 与 4090上没有明显负面影响。六、运行与交互命令行、标题栏信息与操作控制启动与参数编译产物直接运行D3D12RaytracingBasicShaderExecutionReordering.exe可选参数参数说明-forceAdapter ID在指定ID的适配器上创建 D3D12 设备默认使用适配器 0标题栏运行时信息标题栏会实时显示示例名称帧率FPSMillion Primary Rays/s每秒发射的百万级主光线数基于 FPS 与分辨率的乘积计算见 D3D12RaytracingSakuraForestSER.cpp 的CalculateFrameStats()公式为m_width * m_height * fps / 1e6GPU[ID]: 名称SER: ON/OFF当前射线执行重排序功能开关状态。键盘控制按键功能ALTENTER窗口模式 / 全屏模式切换P开启 / 关闭 SER关闭时sortMode置为SORTMODE_OFFHMaybeReorderThread()按 HitObject 排序MMaybeReorderThread()按 reflectHint 排序BMaybeReorderThread()按 HitObject reflectHint 组合排序WASD场景内移动W 前进 / A 左移 / S 后退 / D 右移速度 5.0/秒Q / E垂直升降镜头Q 下降 / E 上升方向键环视上/下 俯仰、左/右 偏航角速度 30°/秒按键切换的 CPU 侧实现见 D3D12RaytracingSakuraForestSER.cpp按下 P 时取反m_serEnabled按 H/M/B 时自动开启 SER 并置对应排序标志每帧据此将m_sceneCB[frameIndex].sortMode写入常量缓冲。相机还有高度下限钳制minCameraHeight 2.02防止穿入地面。七、运行环境要求Windows 10 October 2019 Update 或更高版本支持 DirectX 12 Ultimate 的 GPU 与驱动且设备需支持Shader Model 6.9运行时通过CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL)校验见 D3D12RaytracingSakuraForestSER.cpp其余要求请参阅主文档 D3D12 Raytracing readme工程配置方面D3D12RaytracingSakuraForestSER.vcxproj 使用 v143 工具集、C17支持 x64 与 ARM64 的 Debug/Release 配置Raytracing.hlsl以 Shader Model 6.9 库模式编译。八、源码导览从入口到渲染主循环若想深入研读实现可按以下路径追踪关键环节场景资源与设备管线初始化D3D12RaytracingSakuraForestSER.cpp 的CreateDeviceDependentResources()加载trunk.obj/leaves.obj/bush.obj与两张 JPG 纹理构建 BLAS/TLAS、RTPSO 与三张 shader tableSER 相关 HLSL 核心Raytracing.hlslMyRaygenShader/ComputeReflectionHint/ApplyThreadReordering/ 五个 closest hit 与 miss 着色器共享结构与 SortMode 枚举RayTracingHlslCompat.hMAX_RECURSION_DEPTH 2、SceneConstantBuffer.sortMode、ObjectConstantBuffer.materialID重负载天空盒分形Star.hlsli逐帧状态切换与相机控制D3D12RaytracingSakuraForestSER.cpp 的OnUpdate()。总结Sakura Forest SER 示例的价值在于它不是用简单三角形来演示 API而是构造了一个着色负载天然不均的复杂场景分形天空、反射地板、随机反射立方体、大量植被实例并给出 HitObject、reflectHint、Both 三种可热切换的排序策略与一套完整的性能观察手段FPS、Million Primary Rays/s、标题栏 SER 状态。对照 readme 与源码可以发现SER 的实际收益取决于场景中着色成本的差异性——差异越大、越不稳定重排序越有可能带来收益同时硬件架构本身也会显著影响特定排序键的实际效果如 reflectHint 在 RTX 5070 与 RTX 4080/4090 上的表现差异。这正是将 SER 投入真实项目前值得反复研读的参考实现。赞分享示例工程【免费下载链接】DirectX-Graphics-SamplesThis repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.项目地址https://gitcode.com/gh_mirrors/di/DirectX-Graphics-Samples点击查看免费下载相关推荐Turborepo 微前端配置解析turborepo-microfrontends 的原理、Schema 与本地开发代理集成Turborepo 微前端配置解析turborepo microfrontends 的原理、Schema 与本地开发代理集成 导读 本文围绕 Turborep示例工程Comp AI CRM 中的 nuqs 数组解析器选型parseAsArrayOf 与 parseAsNativeArrayOf 的正确使用Comp AI CRM 中的 nuqs 数组解析器选型parseAsArrayOf 与 parseAsNativeArrayOf 的正确使用 在基于 Next示例工程Vue Query 基础示例实战useQuery 数据获取、缓存复用与后台刷新机制全解析Vue Query 基础示例实战useQuery 数据获取、缓存复用与后台刷新机制全解析 本篇文章以 TanStack Query 官方仓库中的 Vue Qu编译器图形学编程语言上一篇Krita AI Diffusion 插件装完看不到3 步找回你的 AI 绘图面板下一篇Windows CleanerC盘清理免费工具5分钟上手教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表