OpenGL实现通用GPU计算概述
http://blog.csdn.net/zhouxuguang236/article/details/44783553
可能比较早一点做GPU计算的开发人员会对OpenGL做通用GPU计算,随着GPU计算技术的兴起,越来越多的技术出现,比如OpenCL、CUDA、OpenAcc等,这些都是专门用来做并行计算的标准或者说接口。
OpenGL用来做通用GPU计算主要是利用纹理存储器在GPU中计算以及把结果取回内存,这大概是OpenGL做通用GPU计算最好的选择。
大概的流程主要就是先创建OpenGL的环境,接着创建FBO(帧缓存对象)、纹理、设置纹理参数、然后将纹理绑定到帧缓存对象,最后传输数据到纹理,接着用片段着色器对数据进行处理,最后就是取回数据。一个简单的例子如下:
- #include <stdio.h>
- #include <gl/glew.h>
- #include <gl/glut.h>
- int main(int argc,char** argv)
- {
- int nWidth = 8;
- int nHeight = 3;
- int nSize = nWidth*nHeight;
- //创建输入数据
- float *pfInput = new float[4*nSize];
- float *pfOutput = new float[4*nSize];
- for (int i = 0; i < nSize*4; i ++)
- {
- pfInput[i] = i + 1.5;
- }
- //创建绘制窗口
- glutInit(&argc,argv);
- glutCreateWindow("GPGPU");
- glewInit();
- //创建FBO并绑定
- GLuint fb;
- glGenFramebuffersEXT(1,&fb);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);
- //创建纹理对象并绑定
- GLuint tex;
- glGenTextures(1,&tex);
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB,tex);
- //设置纹理参数
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP);
- //将纹理关联到FBO
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_RECTANGLE_ARB,tex,0);
- //定义纹理数据单元类型
- glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGBA32F_ARB,nWidth,nHeight,0,GL_RGBA,GL_FLOAT,0);
- //将数据传输到纹理缓存
- glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,0,0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfInput);
- //读取数据
- glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
- glReadPixels(0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfOutput);
- //打印结果
- for (int i = 0; i < nSize*4; i ++)
- {
- printf("%f\t%f\n",pfInput[i],pfOutput[i]);
- }
- //清除资源
- delete []pfInput;
- delete []pfOutput;
- glDeleteFramebuffersEXT(1,&fb);
- glDeleteTextures(1,&tex);
- return 0;
- }
上面的例子,什么也没做,只是将数据传输到GPU,然后原封不动传回来,主要是验证作用。其实这个例子就是参考GPGPU编程技术-从GLSL、CUDA到OpenCL这本书上的。