gpgpu.cpp
#include <windows.h>
#include <gl/glew.h>
#define FFT_LEVEL 11
#define TEX_SIZE (1<<FFT_LEVEL)
void main(void)
{
unsigned int fb,texReal[2],texImage[2];
unsigned int fs,prg;
unsigned char bmpHead[54];
unsigned char *tex;
HANDLE fin,fout,fCode;
char *code;
unsigned int len,i;
unsigned int real,image,level,state;
unsigned int buffers[2];
unsigned long flag;
PIXELFORMATDESCRIPTOR pfd;
unsigned int pf;
WNDCLASS wc;
HDC hDC;
HGLRC hRC;
HWND hWnd;
//OpenGL初始化
ZeroMemory(&wc,sizeof(WNDCLASS));
wc.lpfnWndProc = DefWindowProc;
wc.hInstance = GetModuleHandle(0);
wc.lpszClassName = "GPGPU";
ZeroMemory(&pfd,sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
RegisterClass(&wc);
hWnd=CreateWindow("GPGPU","GPGPU",0,0,0,0,0,0,0,wc.hInstance,0);
hDC=GetDC(hWnd);
pf=ChoosePixelFormat(hDC,&pfd);
SetPixelFormat(hDC,pf,&pfd);
hRC=wglCreateContext(hDC);
wglMakeCurrent(hDC,hRC);
glViewport(0,0,TEX_SIZE,TEX_SIZE);
//GLSL初始化
glewInit();
fCode = CreateFile("2dfft.fs",GENERIC_READ,0,0,OPEN_EXISTING,0,0);
len = GetFileSize(fCode,&flag);
code = new char[len];
ReadFile(fCode,code,len,&flag,0);
CloseHandle(fCode);
fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs,1,(const char**)&code,0);
glCompileShader(fs);
prg = glCreateProgram();
glAttachShader(prg,fs);
glLinkProgram(prg);
state = glGetUniformLocation(prg,"state");
level = glGetUniformLocation(prg,"level");
real = glGetUniformLocation(prg,"real");
image = glGetUniformLocation(prg,"image");
glUseProgram(prg);
delete []code;
//纹理初始化
glEnable(GL_TEXTURE_2D);
glGenTextures(2,texReal);
glGenTextures(2,texImage);
fin = CreateFile("in.bmp",GENERIC_READ,0,0,OPEN_EXISTING,0,0);
tex = new unsigned char[3*TEX_SIZE*TEX_SIZE];
ReadFile(fin,bmpHead,54,&flag,0);
ReadFile(fin,tex,3*TEX_SIZE*TEX_SIZE,&flag,0);
CloseHandle(fin);
glBindTexture(GL_TEXTURE_2D,texReal[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, TEX_SIZE, TEX_SIZE, 0, GL_BGR, GL_UNSIGNED_BYTE, tex);
ZeroMemory(tex,3*TEX_SIZE*TEX_SIZE);
glBindTexture(GL_TEXTURE_2D,texReal[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, TEX_SIZE, TEX_SIZE, 0, GL_BGR, GL_UNSIGNED_BYTE, tex);
glBindTexture(GL_TEXTURE_2D,texImage[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTex