可能比較早一点做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 %f ",pfInput[i],pfOutput[i]); } //清除资源 delete []pfInput; delete []pfOutput; glDeleteFramebuffersEXT(1,&fb); glDeleteTextures(1,&tex); return 0; }