提示和技巧:光线跟踪最佳实践 (4)

保持任何击中阴影极简。任何命中着色器在每一个TraceRay中执行多次(与最近的命中或未命中着色器相比,例如,后者只执行一次),这使得它们非常昂贵。此外,任何命中都在调用图中寄存器压力最高的点执行。所以为了获得最佳性能,尽可能让它们变得微不足道。

2.2.4 – Shading Execution Divergence

从一个简单的着色实现开始。当实现需要大量材质着色(例如反射或GI)的技术时,性能可能会受到着色散度的限制。这通常有许多原因,但不限于:指令缓存抖动和/或发散内存访问。采用以下策略来解决这些问题:             

使用简化的着色器优化指令发散:             

使用较低质量或简化的材质球(相对于光栅化)进行光线跟踪。             

在某些极端情况下(例如:漫反射GI或粗糙镜面反射),可以从视觉上接受完全回落到顶点级别的着色(这也有减少噪声的附加好处)。             

通过以下方法优化发散内存访问:             

降低纹理访问的分辨率-或偏移mip贴图级别             

将光线跟踪着色器中的照明计算推迟到帧中的稍后点             

在极端情况下,可能需要手动安排(分类/装箱)阴影。当上述优化策略不足时,应用程序可以手动安排着色。但是,这会阻止基于driver/HW的调度生效。英伟达不断改进我们的日程安排。

2.3 – Resources

对场景全局资源使用全局根签名(DXR)或全局资源绑定(VK)。这将避免在本地每几何体根表中进行复制,并应导致更好的缓存行为。             

避免资源临时性。这通常会导致非原语代码重复。例如,将一个纹理保留在一个临时的位置,并根据某些条件对其进行指定,将导致每个可能的纹理指定的所有采样操作重复。可能的解决方法:使用资源数组并动态索引到其中。             

同时访问64位或128位对齐的本地根表数据可以实现矢量化加载。             

对于对齐的原始数据,首选StructuredBuffer而不是ByteAddressBuffer。

3.0 – Denoisers

使用RTX去噪SDK实现高质量、快速的光线跟踪效果去噪。您可以在GameWorks光线跟踪页面找到更多详细信息。

4.0 – Memory Management

对于DXR,将QueryVideoMemory API报告的预算视为软提示。实际节段大小大约大20%。             

将命令分配器隔离到不同类型的命令列表。如果可以避免,不要将非DXR-CAs与DXR-CAs混合和匹配。             

命令分配器重置将不会释放关联的内存。可以使用destroy/create释放这些分配,但必须在关键路径之外执行此操作,以避免长时间暂停             

注意管道的堆栈大小。堆栈大小随着TraceRay调用中保持的活动状态的数量和TraceRay调用周围的控制流复杂性而增加。最大跟踪深度实际上是堆栈大小的一个直接乘法器——尽可能保持低的深度。             

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwgsj.html