这一步,用计算着色器来作层卷积
接口于前面相同。
这里将用一个“缓存对象”来传送全部,包括输入数据,卷积核,及卷积结果(前面部分结果,中间输入数据,后面部分卷积核)。
用不到纹理,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