东莞建网站服务,无极招聘网无极在线,牡丹江信息网0453招聘信息网,网站设计公司北京计算着色器 Compute Shaders
除了面向图形的着色操作#xff0c;例如顶点着色、曲面细分、几何着色和片段着色之外#xff0c;OpenGL还可以通过使用计算着色器进行通用计算。计算管线是一种执行通用着色器的单阶段机器形式。计算着色器按照第7.1节描述的方式创建#xff0c…计算着色器 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_x、num_groups_y 和 num_groups_z 分别指定将在X、Y和Z维度调度的工作组数量。内置向量变量gl_NumWorkGroups 将初始化为 num_groups_x、num_groups_y 和 num_groups_z 参数的内容。一次可以调度的工作组的最大数量可以通过调用GetIntegeri v函数获取其中target设置为MAX_COMPUTE_WORK_GROUP_COUNTindex设置为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_SIZEindex设置为0、1或2分别用于检索X、Y和Z维度的最大工作组大小。
此外单个工作组内的最大调用次数即三个维度之积可以通过调用GetIntegerv函数并设置pname为MAX_COMPUTE_WORK_GROUP_INVOCATIONS来确定。
void glDispatchComputeIndirect( intptr indirect );等效于调用 glDispatchCompute 函数但其参数 num_groups_x、num_groups_y 和 num_groups_z 的值从间接指定的基本机器单元偏移量处当前绑定到 DISPATCH_INDIRECT_BUFFER 绑定点的缓冲区中获取的三个 uint 值初始化。如果 num_groups_x、num_groups_y 或 num_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章。
实现允许跳过某些计算着色器调用的执行并且由于实现相关原因执行额外的计算着色器调用只要渲染的结果在其他方面保持不变。