OpenGL 编程指南(第八版)学习笔记——12 计算着色器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlk1229/article/details/81838761

OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD

文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code

12 计算着色器

之前章节中说到的渲染管线中并没有计算着色器,计算着色器不运行在渲染管线中,其运行在计算管线中,计算管线非常简单,就是只有一个计算着色器。计算着色器本身只是用来做计算的,计算结果并不会输出到屏幕上。

 

计算着色器可通过布局限定符控制计算着色器本地执行的次数,如下:

layout (local_size_x = 128, local_size_y = 100, local_size_z =1) in;

本地执行次数为128*100*1 次。

 

有了计算着色器后需要通过函数glDispatchCompute(x, y, z)启动计算,x,y,z分别代表各个维度会执行多少个本地计算着色器,计算着色器总执行次数为:本地执行次数*x*y*z。

 

当前计算位置

计算着色器是一个高度并发的计算过程,同时会有多个计算着色器程序在显卡中执行。在执行过程中一般需要知道当前执行的位置,从而获取相应的数据,防止并发执行出现访问数据冲突,可以通过以下变量获取位置信息:

const uvec3 gl_WorkGroupSize; //本地工作组大小,通过布局限定符设置的

in uvec3 gl_NumWorkGroups; //本地工作组数量,glDispatchCompute中的参数

in uvec3 gl_LocalInvocationID; //当前执行在本地工作组中的位置

in uvec3 gl_WorkGroupID; //当前本地工作组在全局工作组中的位置

in uvec3 gl_GlobalInvocationID; // 当前执行全局ID

in uint gl_LocalInvocationIndex; //当前执行在本地工作组中的位置,按一维顺序计算

 

通信与同步

因为高度并发所以肯定需要有同步功能,防止访问数据冲突。

  1. 可以通过share标识变量,这样变量是在整个本地工作组中共享的。
  2. barrier()可保证同一个本地工作组全部到达barrier点后再继续执行。
  3. memoryBarrire可以使得变量更新后,之后读取变量都是最新的值。

猜你喜欢

转载自blog.csdn.net/wlk1229/article/details/81838761
今日推荐