【发布时间】:2022-01-10 10:47:38
【问题描述】:
在 OpenGL 中编写片段着色器时,可以在编译时常量、uniform 变量或可变 变量上进行分支。
分支的性能取决于硬件和驱动程序的实现,但通常在编译时间常数上进行分支通常是免费的,并且在 uniform 上进行分支比在 variing 上进行更快 em>。
在 varying 的情况下,光栅化器仍然必须为每个片段插入变量,并且必须在每个族执行时决定分支,即使变化的值是相同的对于当前原语中的每个片段。
我想知道的是,是否有任何图形 API 或扩展允许某些片段着色器分支,每个光栅化图元仅执行一次(或者在平铺渲染的情况下,每个图元每个 bin 执行一次)?
【问题讨论】:
-
当同一个 warp 中的所有线程都遵循相同的代码路径时,在变化上的分支(根据我的经验)与统一分支同样快。当同一个 warp 中的不同线程采用不同的分支时,性能会大幅下降,因为由于 SIMD 架构,不同的分支会一个接一个地执行。因此,您所要求的应该发生在任何相当新的硬件上的任何图形 API 中。
-
@BDL:请注意,波前中的所有片段是否都来自同一个原语,这取决于硬件。一些实现会这样做,而另一些则不会。在同一个波前运行多个图元会更快,特别是对于非常小的多边形。
标签: opengl rendering directx metal vulkan