OpenGL实现通用GPU计算概述

可能比较早一点做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这本书上的。

时间: 2024-07-30 07:20:01

OpenGL实现通用GPU计算概述的相关文章

OpenCL入门:(二:用GPU计算两个数组和)

本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201  (英文版) http://www.cnblogs.com/leiben/archive/2012/06/05/2536508.html (博友翻译的中文版) 一.创建工程 按照OpenCL

Baxter抓取物体的gpu计算调试记录

如下是Baxter抓取物体的gpu计算调试的一个实验记录

GPU计算的十大质疑—GPU计算再思考

http://blog.csdn.NET/babyfacer/article/details/6902985 原文链接:http://www.hpcwire.com/hpcwire/2011-06-09/top_10_objections_to_gpu_computing_reconsidered.html作者:Dr. Vincent Natoli, Stone Ridge Technology (http://www.stoneridgetechnology.com/ )译者:陈晓炜(转载请注

从 SPIR-V 到 ISPC:将 GPU 计算转化为 CPU 计算

游戏行业越来越多地趋向于将计算工作转移到图形处理单元 (GPU) 中,导致引擎和/或工作室需要开发大量 GPU 计算着色器来处理不同的计算任务.但有时候在 CPU 上运行这些计算着色器非常方便,不必重新投资开发它们的 C/C++ 变体.这样做的原因有很多,包括试验和调试非常简单,可充分利用备用 CPU 周期和鼓励基于 CPU 的内容扩展,与其他 CPU 端游戏资产之间进行基于 CPU 的交互,保证结果的确定性和一致性等等.查看详情 原文地址:https://www.cnblogs.com/IDZ

GPU渲染管线概述

1.顶点着色器 顶点着色器是流水线的第一个阶段,它的输入来自于CPU.顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器.顶点着色器需要完成的工作主要有:坐标变换和逐顶点光照.当然,除了这两个主要任务外,顶点着色器还可以输出后续阶段所需的数据.坐标变换,顾名思义,就是对顶点的坐标进行某种变换.例如我们可以通过改变顶点位置来模拟水面,布料等.一个最基本的顶点着色器必须完成的一个工作是:把顶点坐标从模型空间转换到齐次剪裁空间.类似下面代码: o.pos=mul(UNITY_

OpenGL中两种计算投影矩阵的函数

OpenGL无意间同时看到两种创建投影矩阵的写法,可以说它们完成的是同样的功能,但写法完全不同,可以观摩一下什么叫做异曲同工之妙... 第一种: gltMakeShadowMatrix函数是重点 1 // Gets the three coefficients of a plane equation given three points on the plane. 2 void gltGetPlaneEquation(GLTVector3 vPoint1, GLTVector3 vPoint2,

CUDA范例精解通用GPU架构-(2)其实写个矩阵相乘并不是那么难

程序代码及图解析: #include <iostream> #include "book.h" __global__ void add( int a, int b, int *c ) { *c = a + b; } int main( void ) { int c; int *dev_c; HANDLE_ERROR( cudaMalloc( (void**)&dev_c, sizeof(int) ) ); add<<<1,1>>>

OpenGL核心技术之GPU编程

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 3D游戏引擎的核心是渲染,游戏品质的提升需要通过Shader编程实现渲染技术,通常的渲染方式一般会通过Direct3D或者是OpenGL,对于目前比较流行的引擎Unity3D,Coc

Python数据处理与计算——概述

Python是一种面向对象的,动态的程序设计语言,具有非常简洁而清晰的语法,适合于完成各种高层任务.它既可以用来快速开发程序脚本,也可以用来开发大规模的软件. 随着NumPy.SciPy.Matplotlib.Enthoughtlibrarys等众多程序库的开发,Python越来越适合于做科学计算.绘制高质量的2D和3D图像.与科学计算领域最流行的商业软件MATLAB相比,Python是一门通用的程序设计语言,比MATLAB所采用的脚本语言的应用范围更广泛,有更多的程序库的支持.虽然MATLAB