博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL实现通用GPU计算概述
阅读量:6260 次
发布时间:2019-06-22

本文共 1923 字,大约阅读时间需要 6 分钟。

http://blog.csdn.net/zhouxuguang236/article/details/44783553

可能比较早一点做GPU计算的开发人员会对OpenGL做通用GPU计算,随着GPU计算技术的兴起,越来越多的技术出现,比如OpenCL、CUDA、OpenAcc等,这些都是专门用来做并行计算的标准或者说接口。

       OpenGL用来做通用GPU计算主要是利用纹理存储器在GPU中计算以及把结果取回内存,这大概是OpenGL做通用GPU计算最好的选择。

大概的流程主要就是先创建OpenGL的环境,接着创建FBO(帧缓存对象)、纹理、设置纹理参数、然后将纹理绑定到帧缓存对象,最后传输数据到纹理,接着用片段着色器对数据进行处理,最后就是取回数据。一个简单的例子如下:

 

[cpp]   
 
  1. #include <stdio.h>  
  2.   
  3. #include <gl/glew.h>  
  4. #include <gl/glut.h>  
  5.   
  6.   
  7. int main(int argc,char** argv)  
  8. {  
  9.     int nWidth = 8;  
  10.     int nHeight = 3;  
  11.     int nSize = nWidth*nHeight;  
  12.   
  13.     //创建输入数据  
  14.     float *pfInput = new float[4*nSize];  
  15.     float *pfOutput = new float[4*nSize];  
  16.     for (int i = 0; i < nSize*4; i ++)  
  17.     {  
  18.         pfInput[i] = i + 1.5;  
  19.     }  
  20.   
  21.     //创建绘制窗口  
  22.     glutInit(&argc,argv);  
  23.     glutCreateWindow("GPGPU");  
  24.     glewInit();  
  25.   
  26.     //创建FBO并绑定  
  27.     GLuint fb;  
  28.     glGenFramebuffersEXT(1,&fb);  
  29.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);  
  30.   
  31.     //创建纹理对象并绑定  
  32.     GLuint tex;  
  33.     glGenTextures(1,&tex);  
  34.     glBindTexture(GL_TEXTURE_RECTANGLE_ARB,tex);  
  35.   
  36.     //设置纹理参数  
  37.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);  
  38.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);  
  39.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP);  
  40.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP);  
  41.   
  42.     //将纹理关联到FBO  
  43.     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_RECTANGLE_ARB,tex,0);  
  44.   
  45.     //定义纹理数据单元类型  
  46.     glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGBA32F_ARB,nWidth,nHeight,0,GL_RGBA,GL_FLOAT,0);  
  47.   
  48.     //将数据传输到纹理缓存  
  49.     glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,0,0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfInput);  
  50.   
  51.     //读取数据  
  52.     glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);  
  53.     glReadPixels(0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfOutput);  
  54.   
  55.     //打印结果  
  56.     for (int i = 0; i < nSize*4; i ++)  
  57.     {  
  58.         printf("%f\t%f\n",pfInput[i],pfOutput[i]);  
  59.     }  
  60.   
  61.     //清除资源  
  62.     delete []pfInput;  
  63.     delete []pfOutput;  
  64.     glDeleteFramebuffersEXT(1,&fb);  
  65.     glDeleteTextures(1,&tex);  
  66.   
  67.     return 0;  
  68. }  

 

 

上面的例子,什么也没做,只是将数据传输到GPU,然后原封不动传回来,主要是验证作用。其实这个例子就是参考GPGPU编程技术-从GLSL、CUDA到OpenCL这本书上的。

你可能感兴趣的文章
Linux远程登录ssh免密码配置方法(仅供参考)
查看>>
validateJarFile jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet
查看>>
html5学习笔记——html保留标签(二)
查看>>
二分图判定--黑白染色
查看>>
ios 处理 touch 事件时偶尔的击穿现象
查看>>
第105天:Ajax 客户端与服务器基本知识
查看>>
LeetCode70——爬楼梯
查看>>
windows phone 中的TextBlock的一些特性(TextWrapping,TextWrapping)
查看>>
引用类型起的锅
查看>>
java String 类特点
查看>>
LeetCode 300. Longest Increasing Subsequence / 354. Russian Doll Envelopes
查看>>
Loj #2192. 「SHOI2014」概率充电器
查看>>
<x:set/>标签
查看>>
制作首页的显示列表。
查看>>
php 构造函数 __construct()
查看>>
打印多层圣诞树
查看>>
asp.net core ABP模板本地化设置
查看>>
Web应用程序简介
查看>>
[NOI2005]维修数列
查看>>
JSP -- EL表达式
查看>>