OpenGL蓝宝书第十章学习笔记:计算着色器

前言
本篇在讲什么

OpenGL蓝宝书第十章学习笔记计算着色器
本篇适合什么

适合初学OpenGL的小白
本篇需要什么

C++语法有简单认知
OpenGL有简单认知
最好是有OpenGL超级宝典蓝宝书
依赖Visual Studio编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


♠ 本章的学习要点

  • 如何创建、编译和调度计算着色器
  • 如何在计算着色器调用之间传递数据
  • 如何同步计算着色器并有序运行

♠ 计算着色器概述

  • 计算着色器是一种利用图形处理器的强大计算能力实现OpenGL的途径
  • 除其他着色器可用的贴图、存储缓存和原子内存操作等机制外,计算着色器还能实现相互同步和共享数据,从而简化常规计算
  • 计算着色器与其他OpenGL管线均不同,旨在尽可能为应用程字开发人员提供尽可能多的灵活性

简单理解,计算着色器通过共享内存和线程同步功能,采用更有效的方式去处理数据


♠ 使用计算着色器

计算着色器与其他任何着色器是相同的。在GLSL语言中声明着色器对象,并链接到程序对象上,如下述代码所示


static const GLchar * compute_source[] 
{
    "#version 450 core                                      \n"
    "layout (local_size_x = 32,local_size_y = 32) in;       \n"
    "void main(void)                                        \n"
    "{                                                      \n"
    "   //Do nothing                                        \n"
    "}                                                      \n"
}

compute_shader = glCreateshader(GL_COMPUTE_SHADER);
glshaderSource(compute_shader,1,compute_source,NULL);
glCompileShader(compute_shader);

compute_program = glCreateprogram();
glAttachShader(compute_program, compute_shader);
glLinkProgram(compute program);

注意:这里创建shader使用的参数是GL_COMPUTE_SHADER

注意:在同一个program程序上,计算着色器只能单独使用,不能和其他着色器混用


♥ 执行计算着色器


两个关键执行函数,设置全局工作组和局部工作组

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

void glDispatchComputeIndirect(GLintptr indirect);

♣ 全局和局部工作组

调用一次二者任意一个会有一个全局工作组发送到OpenGL用于处理

x、y、z坐标的局部工作组数量由参数num_groups_x、num_groups_y、num_groups_z决定

可通过调用函数glGetIntegeri_v()获取工作组的最大尺寸或单一工作组所能够完成的最大调用总数

可通过调用函数g1Getprogramiv()即可确定程序计算着色器的局部工作组尺寸


♣ 计算着色器输入与输出

计算着色器并无内置输出
前后无任何工序的单工序管线
有一些内置输入变量可用于确定目前在局部工作组和更大全局工作组中的所处位置线

  • gl_LocalInvocationID:着色器调用在局部工作组内的索引

  • gl_workGroupsize:储存局部工作组尺寸

  • gl_NumWorkGroups:工作组数量

  • gl_WorkGroupID:当前工作组在全局数据集中的索引

  • gl_LocalInvocationIndex:代码将 3D 变量转换成 1D 索引


♥ 计算着色器通信

计算着色器可以用共享存储限定符声明变量,从而在同一局部工作组内运行的计算着色器之间实现共享,访问速度很快

共享内存很小,只有几kb,可以通过调用函数glGetIntegerv()来确定


♣ 同步计算着色器

执行barrier()函数,可执行流控制屏障,调用是应阻止调用直到同一局部工作组内的其他所有着色器调用均已达到着色器内的那一点

使用共享内存是,流控制屏障很重要,可以确定局部工作组内其他着色器当前调用到同一点上的具体时间


♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenGL蓝宝书PDF是指《OpenGL超级宝典》一书的电子版本,主要介绍了OpenGL图形学编程的基础知识和开发技巧。 OpenGL是一种跨平台的图形库,可以用于开发高性能的2D和3D图形应用程序。《OpenGL超级宝典》是一本经典的OpenGL教材,适合初学者和有一定OpenGL基础的开发者学习和参考。 这本书的PDF版本提供了一种便捷的阅读方式,可以随时随地通过电脑、平板或手机进行学习。相比于传统的纸质书籍,PDF版本的《OpenGL超级宝典》具有以下优势: 1. 可随时复制和搜索:PDF格式的书籍可以方便地进行复制和搜索,使得我们可以快速找到我们需要的内容,并方便地进行引用和参考。 2. 纸质书籍的替代品:PDF版本的书籍不占用实体空间,而且可以通过电子设备随时携带,方便在任何时间、任何地点进行学习和阅读。 3. 交互性强:PDF格式的书籍还可以添加书签、注释和标记,方便读者进行个性化的标记和笔记,更好地帮助记忆和理解。 总之,《OpenGL超级宝典》PDF版本是一种便捷、高效的学习OpenGL图形学编程的工具,通过这本书,读者可以系统地学习OpenGL的基础知识和开发技巧,从而提高自己在图形学编程领域的能力。 ### 回答2: OpenGL蓝宝书是一本关于OpenGL编程的经典教材,适合初学者和有一定编程基础的开发者。本书全面介绍了OpenGL的基础知识和常用编程技巧,并提供了大量的代码示例和实践项目。 这本书的PDF版本提供了方便的电子阅读方式,读者可以随时随地学习和实践OpenGL编程。使用PDF格式的优点是可以根据需要进行搜索、标注、复制和打印,在学习过程中方便查阅和注释,提高学习效率。 《OpenGL蓝宝书》的内容涵盖了OpenGL的基础知识,包括顶点和片元着色器、图元绘制、纹理映射、新的OpenGL特性等。此外,该书还介绍了OpenGL的高级技术,如光照、阴影、透明度、几何着色器等,帮助读者掌握更复杂的图形渲染技术。 这本书对于学习OpenGL编程的人来说是一部非常有价值的参考资料。它通过清晰的逻辑结构和易于理解的语言,帮助读者理解和掌握OpenGL的核心概念和编程技巧。同时,书中提供的示例代码和实践项目可以帮助读者巩固所学知识,并进一步探索OpenGL的应用。 总的来说,《OpenGL蓝宝书》的PDF版本是一种方便快捷的学习OpenGL编程的方式,可以满足读者在不同场合和需求下的学习和实践需求。无论是初学者还是有一定经验的开发者,都可以从中获得宝贵的知识和经验。 ### 回答3: OpenGL蓝宝书是一本经典的OpenGL编程指南,全书详尽地介绍了OpenGL的基础知识和编程技巧。这本书的完整版可以在网上找到PDF格式的电子书。通过阅读OpenGL蓝宝书,我们可以了解到OpenGL的底层原理、渲染管线以及各种常用的绘图和渲染技术。 OpenGL是一种跨平台的图形编程接口,它可以用于开发2D和3D图形应用程序。蓝宝书从基础概念开始,逐步介绍OpenGL的各个方面,包括顶点缓冲对象、着色器、纹理映射、光照等。通过例子和代码实践,读者可以深入理解OpenGL的工作原理,并学会如何使用OpenGL进行图形渲染。 OpenGL蓝宝书的PDF版本提供了便捷的学习方式。电子版本便于阅读和搜索,可以随时随地进行学习。同时,通过电子书的书签和目录功能,读者可以方便地定位到自己感兴趣的章节和内容。此外,电子书的PDF格式可以在多个设备上使用,如电脑、平板电脑和手机等。 总之,OpenGL蓝宝书PDF是一本非常有价值的OpenGL学习资料,它为初学者提供了一个系统而又详细的学习路径,帮助读者深入理解OpenGL的基础知识和编程技巧。无论是对于想要学习图形编程的人来说,还是对于已经对OpenGL有一定了解的开发者来说,这本书都是一本非常值得阅读的指南。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值