理解计算着色器中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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499873.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js中的并发和多线程处理

在Node.js中,处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的,这意味着它在任何给定时间内只能执行一个任务。然而,Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中,我们将探讨…

vue实现自定义树形穿梭框功能

需求: 我们在开发过程中,会遇到需要将一个数据选择做成穿梭框,但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示,ElementUI自身无法在穿梭框中添加树形结构,网上搜到了大佬封装的插件但是对于右侧的无树形结…

pix2pix-zero

pix2pix-zero:零样本图像到图像转换 论文介绍 Zero-shot Image-to-Image Translation 关注微信公众号: DeepGoAI 项目地址:https://github.com/pix2pixzero/pix2pix-zero 论文地址:https://arxiv.org/abs/2302.03027 本文介绍了一种名为…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题,如果我没有理解错的话,应该就是前后同时传递文件数据 非文件数据,前后端数据该如何接收,这里我给出我自己的解决方案 tip:下文在编写前端代码的时候,用到了这篇…

NPN型三极管与PNP型三极管基本原理

NPN型三极管与PNP型三极管基本原理 文章目录 NPN型三极管与PNP型三极管基本原理一、三极管二、结构三、工作原理四、基本应用五、总计 一、三极管 三极管是电子电路中最基本、最常见、重要的器件,其主要功能是对电流的放大和开关作用,从半导体结构上可以…

鸿蒙开发相关知识(三)【路由、显示动画、属性动画、组件内转场动画、http数据请求、第三方库axios、页面和自定义组件生命周期】

文章目录 一、路由1、清空页面栈2、路由跳转模式3、跳转到应用内的指定页面4、某个页面替换当前页面5、返回上一页面或指定的页面6、获取路由参数7、开启页面返回询问对话框8、导入路由模块9、页面路径配置10、完整示例 二、属性动画和显式动画1、属性动画2、显示动画3、组件内…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码,但是我在第一步就被卡住无法更改密码,输入指令也报错,检查的环境变量也没错,经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

(详解)python调用另一个.py文件中的类和函数或直接运行另一个.py文件

一、同一文件夹下的调用 1.调用函数 A.py文件如下: def add(x,y):print(和为:%d%(xy))在B.py文件中调用A.py的add函数如下: import A A.add(1,2)或 from A import add add(1,2)2.调用类 A.py文件如下: class Add:def __ini…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

VUE-npm ERR! C:\rj\node-v14.4.0-win-x64\nod

错误 解决办法 node -v 查看版本 npm config set registry https://registry.npmmirror.com 设置下载源 npm config get registry 获取下载源

第三个实验,三个浮点数的运算

两个浮点数相加 得到的结果再和第三个数相减 最后显示计算结果 第一步:新建项目 第二步:添加运算部件 第四步:添加浮点数值部件 第五步:修改数值部件类型 第六步:在前面板添加输出结果显示部件 第七步:连…

github-actions

文章目录 workflow触发器action市场contextsecrets 默认环境变量 workflow name: {{workflow name}} run-name: {{workflow runs name}}on: {{触发器}} #[push]env:{{定义workflow变量}}: valuejobs:{{job name}}:runs-on: {{运行机器}} #ubuntu-latestenv:{{定义job变量}}: v…