首页 > 解决方案 > 如何丢弃 GLSL 计算着色器中的调用

问题描述

我正在尝试使用 GLSL 4.6 中的计算着色器实现正向+渲染,但我不知道在使用屏幕外像素时如何同步工作组内的线程。例如,我的窗口分辨率为1600x900,并且我使用的工作组大小为16x16,其中每个线程或调用对应于屏幕上的单个像素,这意味着size_x = 1600/16 = 100and size_y = 900/16 = 56.25,所以我需要调用

glDispatchCompute(100, 57, 1);

如您所见,工作组中的某些线程可能表示超出屏幕的像素,因此我想return尽早或discard将这些屏幕外像素跳过复杂的计算。但是,我的计算着色器还包含barrier()多个地方的调用以同步本地线程,我不知道如何组合它们。文件说

对于计算着色器中任何给定的静态屏障实例,单个工作组内的所有调用都必须先进入它,然后才能继续超出它。

……

在返回声明后也不允许设置障碍

我能想到的唯一解决方法是伪造这些线程的计算,或者if-else让它们在两个barrier()调用之间的中间阶段尽早完成。我想这会带来一点性能损失。那么,有没有更好的方法来排除工作组中的无效线程?我相信这个问题对于计算着色器来说很常见,所以可能有一种惯用的方法来处理它。

标签: openglglslcompute-shader

解决方案


推荐阅读