opengl - 如何丢弃 GLSL 计算着色器中的调用
问题描述
我正在尝试使用 GLSL 4.6 中的计算着色器实现正向+渲染,但我不知道在使用屏幕外像素时如何同步工作组内的线程。例如,我的窗口分辨率为1600x900
,并且我使用的工作组大小为16x16
,其中每个线程或调用对应于屏幕上的单个像素,这意味着size_x = 1600/16 = 100
and size_y = 900/16 = 56.25
,所以我需要调用
glDispatchCompute(100, 57, 1);
如您所见,工作组中的某些线程可能表示超出屏幕的像素,因此我想return
尽早或discard
将这些屏幕外像素跳过复杂的计算。但是,我的计算着色器还包含barrier()
多个地方的调用以同步本地线程,我不知道如何组合它们。文件说
对于计算着色器中任何给定的静态屏障实例,单个工作组内的所有调用都必须先进入它,然后才能继续超出它。
……
在返回声明后也不允许设置障碍
我能想到的唯一解决方法是伪造这些线程的计算,或者if-else
让它们在两个barrier()
调用之间的中间阶段尽早完成。我想这会带来一点性能损失。那么,有没有更好的方法来排除工作组中的无效线程?我相信这个问题对于计算着色器来说很常见,所以可能有一种惯用的方法来处理它。
解决方案
推荐阅读
- r - R中的PosixCT转换失败
- css - 编辑 Angular 材质的表格单元格填充
- c# - 关于Windows Server 2016的IIS上的ASP.NET MVC3 Web应用部署
- python - 如何构建多索引转换矩阵?
- webpack - webpack -v 无休止地声明必须安装一个用于 webpack 的 CLI
- azure - 查看 Azure SQL 用户属性
- php - Angular 5 到 PHP POST 总是返回 403
- python - 嵌套列表上的 ast.literal_eval 内存错误
- c# - 复制粘贴 WPF Datagrid 时显示 GridLines
- ios - 使用 Swift 4.1.2 编译的模块无法在 Swift 4.1.50 中导入:Xcode 10 错误