19 OpenGL计算着色器

计算着色器 Compute Shaders

除了面向图形的着色操作,例如顶点着色、曲面细分、几何着色和片段着色之外,OpenGL还可以通过使用计算着色器进行通用计算。计算管线是一种执行通用着色器的单阶段机器形式。计算着色器按照第7.1节描述的方式创建,其类型参数为COMPUTE_SHADER。它们作为程序对象的一部分附加并使用,如第7.3节所述。

计算负载由称为工作组的工作项组成,并通过计算程序的可执行代码处理。工作组是一组执行相同代码的着色器调用,可能以并行方式执行。同一工作组内的某个调用可以通过共享变量与其他成员共享数据(参见OpenGL着色语言规范第4.3.8节“Shared Variables”),并发出内存和控制屏障以与其他同一工作组的成员同步。

通过调用以下函数启动一个或多个工作组:

void glDispatchCompute( uint num_groups_x, uint num_groups_y, uint num_groups_z );

每个工作组将由计算着色器阶段的活动程序对象处理。计算着色器阶段的活动程序与确定其他管线阶段活动程序的方式相同,如第7.3节所述。尽管工作组内部的各个着色器调用作为一个整体执行,但各个工作组是完全独立且按未指定顺序执行的。

num_groups_xnum_groups_ynum_groups_z 分别指定将在X、Y和Z维度调度的工作组数量。内置向量变量gl_NumWorkGroups 将初始化为 num_groups_xnum_groups_ynum_groups_z 参数的内容。一次可以调度的工作组的最大数量可以通过调用GetIntegeri v函数获取,其中target设置为MAX_COMPUTE_WORK_GROUP_COUNT,index设置为0、1或2,分别代表X、Y和Z维度。

如果任一维度的工作组计数为零,则不调度任何工作组。

每个维度的工作组大小在编译时通过输入布局限定符在程序关联的一个或多个计算着色器中指定(参见OpenGL着色语言规范第4.4.1.4节“Compute Shader Inputs”)。程序链接后,可以通过调用GetProgramiv函数并设置pname为COMPUTE_WORK_GROUP_SIZE来查询程序的工作组大小。这将返回一个包含由其输入布局限定符指定的计算程序的工作组大小的三个整数数组。

最大工作组大小可以通过调用GetIntegeri v函数获取,其中target设置为MAX_COMPUTE_WORK_GROUP_SIZE,index设置为0、1或2,分别用于检索X、Y和Z维度的最大工作组大小。

此外,单个工作组内的最大调用次数(即三个维度之积)可以通过调用GetIntegerv函数并设置pname为MAX_COMPUTE_WORK_GROUP_INVOCATIONS来确定。

void glDispatchComputeIndirect( intptr indirect );

等效于调用 glDispatchCompute 函数,但其参数 num_groups_xnum_groups_ynum_groups_z 的值从间接指定的基本机器单元偏移量处当前绑定到 DISPATCH_INDIRECT_BUFFER 绑定点的缓冲区中获取的三个 uint 值初始化。如果 num_groups_xnum_groups_ynum_groups_z 中任意一个大于相应维度的 MAX_COMPUTE_WORK_GROUP_COUNT 值,则结果未定义。

计算着色器变量 Compute Shader Variables

计算着色器可以访问属于当前程序对象的 uniform 变量。关于 uniform 存储的限制以及操作 uniform 的方法在第7.6节中有描述。

在单个程序对象中声明为 shared 的所有变量的总大小存在限制。这个限制以基本机器单位的单位表示,可以通过查询 MAX_COMPUTE_SHARED_MEMORY_SIZE 的值来获取。对于给定程序对象所需的总大小是依赖于实现的。但是,这个总大小不得超过如果所有声明为 shared 的活动变量改为声明为带有 std430 修饰符的着色器存储块的任意排序成员时所获得的最大块大小。

计算着色器查询 Compute Shader Queries

计算着色器查询使用查询对象来跟踪计算着色器调用的数量。

当调用 BeginQuery 并以 COMPUTE_SHADER_INVOCATIONS 作为目标时,由 GL 维护的计算着色器调用计数被设置为零。当计算着色器调用查询处于活动状态时,每次调用计算着色器时计数器都会递增(参见第19章)。

实现允许跳过某些计算着色器调用的执行,并且由于实现相关原因执行额外的计算着色器调用,只要渲染的结果在其他方面保持不变。

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值