这一步,用计算着色器来作层卷积
接口于前面相同。
这里将用一个“缓存对象”来传送全部,包括输入数据,卷积核,及卷积结果(前面部分结果,中间输入数据,后面部分卷积核)。
用不到纹理,FBO(屏幕外帧缓冲区)。
启用计算单位:
mNumGroupsX = iWidth;
mNumGroupsY = iHeight;
mNumGroupsZ = 1;
分配数据空间,并传送数据:
//glGenBuffers(1, &buffOut);//在初始化中生成
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffKernel);
//输出 + 核 + 输入
int totalSpace= wh * outNum + kSize * inNum * outNum + wh * inNum;
glBufferData(GL_SHADER_STORAGE_BUFFER, totalSpace * sizeof(float) , NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffKernel);
float* pp = (float*)glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_WRITE);
//中间部分存放核
pp += wh * outNum;//跳过结果
memcpy(pp, kernel, kSize * inNum * outNum * sizeof(float));
//最后部分存放输入
pp += kSize * inNum * outNum;//跳过卷积核
memcpy(pp, inData, wh * inNum * sizeof(float));
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
传送给计算着色器一些
用计算着色器进行GLSL层卷积

这篇博客介绍了如何利用计算着色器进行层卷积操作,通过创建缓存对象传递输入数据、卷积核和结果。不使用纹理和FBO,通过启用计算单位分配数据并传送给计算着色器,计算速度接近片元着色器,计算单位的数量影响计算效率,越多则速度越快。
最低0.47元/天 解锁文章
539

被折叠的 条评论
为什么被折叠?



