理解计算着色器中glsl语言的内置变量

概要

本文通过示例的方式,着重解释以下几个内置变量:

  • gl_WorkGroupSize
  • gl_NumWorkGroups
  • gl_LocalInvocationID
  • gl_WorkGroupID
  • gl_GlobalInvocationID

基本概念

局部工作组与工作项

一个3x2x1的局部工作组示例如下,每个小篮格子表示一个工作项,每个工作项会执行计算着色器
局部工作组示例图
gl_WorkGroupSize表示局部工作组的三维大小,在这里,gl_WorkGroupSize = (3,2,1)
此外,在glsl中,使用如下代码设置gl_WorkGroupSize

layout (local_size_x = 3, local_size_y = 2, local_size_z = 1) in;

默认值为1,也可这样设置

layout (local_size_x = 3, local_size_y = 2) in;

全局工作组

一个2x3x1的全局工作组示例如下,由局部工作组组成
全局工作组示例图
gl_NumWorkGroups表示工作组的三维数量,在这里,gl_NumWorkGroups = (2,3,1)
在opengl中使用如下方法设置工作组数量

glDispatchCompute(2,3,1);

执行中的工作组与工作项

一个2x3x1的全局工作组示例如下,橙色表示当前正在执行的工作组,绿色表示当前正在执行的工作项
执行中的工作组与工作项示例图
gl_LocalInvocationID表示在执行的工作项在局部工作组中的位置,gl_LocalInvocationID = (0,1,0)
gl_GlobalInvocationID表示在执行的工作项在全局工作组中的位置,gl_GlobalInvocationID = (3,3,0),计算公式如下:
g l _ G l o b a l I n v o c a t i o n I D = g l _ W o r k G r o u p I D × g l _ W o r k G r o u p S i z e + g l _ L o c a l I n v o c a t i o n I D gl\_GlobalInvocationID = gl\_WorkGroupID \times gl\_WorkGroupSize + gl\_LocalInvocationID gl_GlobalInvocationID=gl_WorkGroupID×gl_WorkGroupSize+gl_LocalInvocationID
gl_WorkGroupID表示执行的工作组中全局工作组中的位置,gl_WorkGroupID = (1,1,0)
gl_LocalInvocationIndex表示在执行的工作项在局部工作组中的索引,gl_LocalInvocationIndex = 3,计算公式如下:
g l _ L o c a l I n v o c a t i o n I n d e x = g l _ L o c a l I n v o c a t i o n I D . z × g l _ W o r k G r o u p S i z e . x × g l _ W o r k G r o u p S i z e . y + g l _ L o c a l I n v o c a t i o n I D . y × g l _ W o r k G r o u p S i z e . x + g l _ L o c a l I n v o c a t i o n I D . x \begin{align*} gl\_LocalInvocationIndex &= gl\_LocalInvocationID.z \times gl\_WorkGroupSize.x \times gl\_WorkGroupSize.y \\&+ gl\_LocalInvocationID.y \times gl\_WorkGroupSize.x \\&+ gl\_LocalInvocationID.x \end{align*} gl_LocalInvocationIndex=gl_LocalInvocationID.z×gl_WorkGroupSize.x×gl_WorkGroupSize.y+gl_LocalInvocationID.y×gl_WorkGroupSize.x+gl_LocalInvocationID.x

参考文章

  1. 使用计算着色器(Compute Shader)模拟粒子效果【OpenGL】【GLSL】
  2. OpenGL 计算着色器
  3. OpenGL学习-高级OpenGL-ComputeShader
  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值