问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在OpenGL中使用Compute Shader(一)

发布网友 发布时间:2023-03-26 02:10

我来回答

1个回答

热心网友 时间:2023-10-20 09:23

先了解一些Compute Shader的基本概念
https://www.cg.tuwien.ac.at/courses/Realtime/repetitorium/VU.WS.2014/rtr_rep_2014_ComputeShader.pdf

最小执行单元为thread,也称为invocation,一个thread执行一遍shader程序
网格化的thread构成了work group,可以是1维、2维或者3维的。shader程序中用layout语句指定的local_size_x,local_size_y,local_size_z决定了work group的大小。
网格化的work group构成了dispatch,同样也可以是1维、2维或者3维的。glDispatchCompute中的三个参数指定了x, y, z三维的大小

ps:
https://www.khronos.org/assets/uploads/developers/library/2014-siggraph-bof/KITE-BOF_Aug14.pdf
根据资料,work group的尺寸也可以完全由c程序决定,GLSL中的声明改为
layout( local_size_variable ) in;

对比cuda的概念,compute shader中的work group就是cuda的block,dispatch就是cuda的grid。

OpenGL 4.2中Image介绍
https://blog.csdn.net/u010462297/article/details/50469950

image类型数据与sampler类型数据的区别:sampler取样本的时候,可以是非整数坐标,而且需要对周边像素进行插值才能获取。而image类型只能取整数坐标,直接取出原始数据样本

ps: gl_GlobalInvocationID.x的类型是uint,而imageLoad需要的坐标参数为int。可以用int(表达式)进行强制类型转换

要开始跑计算,首先要解决的是数据的输入和输出问题。ComputeShader中参数的声明非常类似原来的FragmentShader,还是使用uniform作为输入。不过数据类型可以使用image类型了,不再是sampler类型,解决精准取值的问题。另外,作为输入的image,还需要在layout指令中指明格式,例如r32f或者rgba32f(这里只有1、2、4色的格式,没有rgb三色的格式。不过比较奇怪的一点,作为输出的image可以不指明格式,暂时不知道为什么)。而且,image对象需要调用glBindImageTexture跟纹理对象进行绑定。而且还有一点需要非常注意
“A very important restriction for using shader images is that the underlying texture must have been allocated using "immutable" storage, i.e. via glTexStorage*()-like functions, and not glTexImage2D().”

cpu与gpu之间传数据,往gpu传入使用 glTexSubImage,从gpu读出使用glGetTexImage(glReadPixels需要跟FBO一起使用才可以,而glGetTexImage可以直接从texture读取)

至于OpenGL的初始化工作,还是采用freeglut+glew的经典组合就可以完成。

一个最简单的例子,传输一个一维数组,然后给数组里面每个元素加1。

参考
http://wili.cc/blog/opengl-cs.html
https://antongerdelan.net/opengl/compute.html
https://www.cnblogs.com/chen9510/p/12000320.html
https://blog.csdn.net/koibiki/article/details/80590885
https://arm-software.github.io/opengl-es-sdk-for-android/compute_intro.html
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 梦见身边围绕着好多小鱼的预兆 揣摩拼音 揣摩读音 上海信息系统项目管理师待遇 为什么手机应用总是自动退出后台? 存款机吞钱了,怎么办? 为什么注册了一个微信账号在腾讯视频上登录登原来的切换不过来 《精武风云·陈真》完整版 冬天防冻手的办法 关于安全伴我们成长的手抄报 安全伴我形手抄报 漂亮简单的安全伴我成长手抄报 简单的安全手抄报 初中安全伴我成长手抄报 安全伴我形手抄报 安全伴你成长手抄报 安全伴我行手抄报 安全伴我快乐成长的手抄报 安全伴我行手抄报 海尔柜机空调风页怎么拆洗 琼浆玉液美食享琼楼玉宇华宅居的意思 华为手表连接手机后手机没声音 荣耀手表突然没有声音了 荷兰豆性寒还是性温 荷兰豆吃了会胀气吗 荷兰豆好消化吗 荷兰豆好不好消化 梦见去看守所看人的预兆 我冬天喜欢用凉水洗头不知道好不好? 牛叫声是什么声音 与股票相比,哪项不是债券的特征 苹果越狱后的插件在哪下? 蒜重茬过几年才能种 帮助小鸡过河第19关怎么过 高铁可以送老人上车吗能不能送老人上高生病走动不方便可以送上车吗? 猥琐的意思是什么解释 喷雪花怎么养 梦见一头大猪带许多小猪的预兆 运维有啥出路,想去当公务员,网络方面的,怎么样 海南最大的免税店在哪? 梦见狗咬自已的预兆 《爱情悠悠药草香》哪里能看? calm的副词 王者营地如何查看对战评估 玩具已经破旧不堪却舍不得扔,孩子恋旧多半是什么原因? 港澳通行证可以一个月去几次澳门? 日木哪个城市上空有个大头像?