前言
利用GPU的计算能力运算
不同于其他着色器,它可以实现互相同步和共享数据
无固定输入或输出,不与其他任何固定管线工序相接,灵活性高,具有其他工序不具备的功能
一、使用计算着色器
计算着色器必须是单独的程序,不能组合其他着色器(顶点、曲面细分、几何、片段)
1.执行计算着色器
简述:计算着色器在工作组中执行,有且只有一个全局工作组发送到opengl执行,全局工作组下有多个局部工作组,每个局部工作组都有自己的工作项(3D区块),每个工作项可以在计算着色器的布局限定符设置
glDispatchCompute()和glDispatchComputeIndirect():设置局部工作组的个数
glGetIntegeri_v():获取局部工作组的工作状态,例如:全局工作组的最大尺寸(局部工作组的数量),一个局部工作组的容积
glGetIntegeriv():获取一个局部工作组的容积
计算着色器的输入与输出:
简述:无内置输出,是一个单工序管线,内置变量可以确定局部工作组和工作项的位置(索引)
gl_WorkGroupID:局部工作组在全局工作组的索引,例如:gl_WorkGroupID.x、gl_WorkGroupID.y、gl_WorkGroupID.z
gl_LocalInvocationID:工作项在局部工作组的索引,例如:gl_LocalInvocationID.x、gl_LocalInvocationID.y、gl_LocalInvocationID.z
gl_NumWorkGroups:局部工作组的调用总数
gl_WorkGroupSize:工作项的调用总数
gl_LocalInvocationIndex:将工作项中的3D变量转换成1D索引
可以使用imageStore、atomics当成着色器输出,写入到着色器存储区块,例如:图像倒置
2.计算着色器通信
简述:计算着色器可以通过有限个共享存储限定符声明变量通信,访问速度很快
同步:通过barrier()函数,注意竞争条件和barrier()对竞争条件的影响
示例:并行前缀和、景深的应用
计算着色器群集:
简述:个体的行为仅基于其对周围其他群体成员的感知,成员之间并没有就某项决定产生任何合作关系,例如:鱼群没有领头鱼
示例:集群的纸飞机