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

news2024/11/24 10:34:03
前言
本篇在讲什么

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

♠ 结语

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

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea+maven+springboot项目搭建系列--2 整合Rabbitmq完成客户端服务器端消息收发

前言:本文通过springBoot -maven 框架,对Rabbitmq 进行整合,完成客户端消息的发送和消费; 1 为什么要使用Rabbitmq: RabbitMQ 是一个可靠的、灵活的、开源的消息中间件,具有以下优点: 异步通信…

【C++】C++前言

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 1.什么是C 2.C的发展史 3.C的重要性 a.使用广泛 b.C/C的应用 1.操作系统以及大型系统软件开发 2.服务器端开发 3.游戏开发 4.嵌入式和物联网领域 5.数字图像处理 6.人工智…

AVL树的解析

我们在之前的学习里面已经发现了,搜索二叉树是有一些问题的。它可能会存在单边树的问题,如果你插入的值是有序的话,就会导致这个问题。 那我们肯定是要来解决一下的,如何解决呢? 》一种解决方案是AVL树,还有…

【云原生 | 54】Docker三剑客之Docker Compose应用案例二:大数据Spark集群

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

天下苦 Spring 久矣,Solon v2.3.3 发布

Solon 是什么框架? 一个,Java 新的生态型应用开发框架。它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态)。与其他框架相比,它解决了两个重要的痛点:启动慢,费资源。…

HarmonyOS学习路之开发篇—Java UI框架(PositionLayoutAdaptiveBoxLayout)

PositionLayout 在PositionLayout中,子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角;当向下或向右移动时,坐标值变大;允许组件之间互相重叠。 PositionLayout示意图 布局方式 PositionLayout以坐标的形式控制组件的…

基于Hexo和Butterfly创建个人技术博客,(4) 使用通用的Markdown语法编写博客文章

Hexo官司网查看 这里 hexo的博文建议是用markdown语法来写,原因markdown简单通用,比如很多博客平台都会提供md编辑器,这样如果我们想把同一篇文章发到多个博客平台上(事实上很多人也是这样做的),md应该是最好的编写方法了&#xf…

目标检测数据集---交通信号数据集

✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的数据集会在该…

js控制台 console.log 输出美化,及其他操作

1.格式美化 console.log(%c红色%c蓝色%c绿色, color: red;, color: blue;, color: green;) console.log(%c一段文字\n换行一下\n%c SmileSay %c 版本:1.0.0 ,color: #3eaf7c; font-size: 16px;line-height:30px;,background: #35495e; padding: 4px; border-radius…

数仓数据质量保障方法

一、有赞数据链路 1、数据链路介绍 首先介绍有赞的数据总体架构图: 自顶向下可以大致划分为应用服务层、数据网关层、应用存储层、数据仓库,并且作业开发、元数据管理等平台为数据计算、任务调度以及数据查询提供了基础能力。 以上对整体架构做了初步…

射频电路layout总结

射频电路板设计由于在理论上还有很多不确定性,因此常被形容为一种“黑色艺术”,但这个观点只有部分正确,RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则。在实际设计时,真正实用的技巧是当这些准则和法则因各种设计约束…

OpenCV(图像处理)-基于Oython-滤波器(低通、高通滤波器的使用方法)

1.概念介绍2. 图像卷积filter2D() 3. 低通滤波器3.1 方盒滤波和均值滤波boxFilter()blur() 3.2 高斯滤波(高斯噪音)3.3 中值滤波(胡椒噪音)3.4 双边滤波 4. 高通滤波器4.1Sobel(索贝尔)(高斯&am…

软考A计划-系统架构师-知识点汇总-下篇

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

​Agile与Scrum的比较

作者| Deepali chadokar Agile和Scrum是软件开发中经常使用的两个相关概念。Agile是一个概括性的术语,包含了一组软件开发的价值观和原则,而Scrum是Agile方法中的一个特定框架。 Agile强调协作、灵活性和适应性,以及应对变化的能力。此外&…

Vue中 echarts响应式页面变化resize()

前言 Vue项目中开发数据大屏,使用echarts图表根据不同尺寸的屏幕进行适配 BUG:当页面进行缩放时图表大小没有变化 使用到的方法: resize() 调用echarts中内置的resize函数进行自适应缩放,然后添加监控,页面销毁时删掉…

Zabbix“专家坐诊”第195期问答汇总

问题一 Q:麻烦请教一下zabbix服务器总是上报这几个告警,需要处理嘛?怎么处理? A:同步历史数据进程负载过高的话会影响到server的性能,建议增加服务器硬件配置。 Q:是需要增加哪方面的配置&…

ISO21434 威胁分析和风险评估方法(十二)

目录 一、概述 二、目标 三、资产识别 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、威胁场景识别 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 五、影响等级 5.1 输入 5.1.1 先决条件 5.1.2 进一…

制造业如何进行数字化转型?这个解决方案能帮你!

制造业如何有效实现数字化?制造业企业数字化的趋势已成必然,那么,如何进行制造业企业的数字建设成为各传统制造业企业的探索方向。 于是,我们团队在调研了数百家企业之后,形成了这套制造业数字化从0到1,从…

一文让你用上Xxl-Job 顺带了解cron表达式

文章目录 1.定时任务框架-xxljob1.1 Xxljob介绍1)xxljob概述2)XXL-JOB特性3) 整体架构4)入门资料准备 1.2 xxljob快速入门1)导入xxljob工程2)配置数据库1.初始化SQL脚本2.配置数据库环境3.业务处配置任务注册中心 3&am…

【色度学】光学基础

1. 光的本质 (1)波长不同的可见光,引起人眼的颜色感觉不同。 (2)人们观察到的颜色是物体和特有色光相结合的结果,而不是物体产生颜色的结果。 2. 光度量 【ISP】光的能量与颜色(1&#xff0…