glsl实现图像2DFFT

本文档展示了如何使用GLSL(OpenGL着色语言)在GPU上实现2D快速傅立叶变换(FFT)。代码首先进行了OpenGL初始化,接着加载GLSL着色器,然后对输入图像进行一系列的重排序和傅立叶变换步骤,最后将结果保存到新的位图文件out.bmp中。整个过程涉及纹理初始化、离屏缓冲和多个GPU计算阶段来完成2D FFT和滤波操作。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值