我对片段着色器进行了一些繁重的计算,并且这是在多次传递中进行的。但是在某些 Fragment 上,仅经过一次 pass 后结果就准备好了,而对于其他 Fragment,则需要更多的 pass。
正因为如此,很多片段会在一段时间后丢弃,但正如我们所知,这些线程可能会停止,直到所有其他片段都完成。
我想知道。由于某些 opengl 版本,可以从片段着色器写入模板缓冲区。当我知道我不需要对特定片段进行另一次传递时,我可以写入模板缓冲区。在下一个渲染过程中,我可以打开模板测试以防止这些片段再次计算。
我的问题:这会防止停滞问题吗?这些线程是否可以用于执行更多仍有待处理的片段,以便在每次通过消除下一次通过的片段时,每次通过都会比前一次更快?
换句话说,假设我需要计算一个 16x16 的纹理。在第一遍中,我必须计算 256 个片段(假设我有 16 个内核,这意味着 16 个周期)。例如,如果在第一次通过之后,我知道我只需要对 128 个片段进行进一步计算,并且我已经标记了在模板缓冲区中完成的片段,那么第二次通过的速度是否会提高一倍(所以:16 上的 128 个片段核心 = 8 个周期而不是 16 个)?