A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

使用OpenGL进行通用计算需要解决几个问题

1.计算流水线的终点是帧缓存或显示器,而科学计算的结果一般需要写入存储器,这是怎么做到的?
使用纹理缓存。





2.图形流水线处理的是坐标信息和像素信息,怎么才能使它处理通用数据?
使用正对投影平面的正交投影。

3.OpenGL提供的有限数量的图形处理函数对数据处理效果非常单一,而且都是针对三维模型和像素值的函数,如何制定科学计算所需的算法?
GPGPU的计算过程:
1)将数据数据保存为纹理图

用户可以将数据放置在二维数组或三维数组中。因为纹理元最多只能有RGBA四个颜色通道,所以在存为三维数组时,第三维不能大于4。

2)将数据加载到纹理缓存

传输前注意显存大小,以及所支持的最大单张纹理图尺寸。超出限制,可对数据分批进行计算。

3)使用正对投影平面的正交投影

在常规的OpenGL三维图形显示原理中,投影的过程常常伴随着对原来对象整体的放大或缩小(比如透视投影),以及在某一个方向上的尺寸缩放(如将一个略有侧转的平面正交投影到投影平面后,虽然物体整体尺寸未变,但在侧转方向上的投影图形略有缩短)。在GPGPU中,每个像素对用户来说都是一个数据,在整个投影过程中应保证这个像素不被缩短(遮挡),也不被拉长(或复制),即应避免任何次尺寸的变化。这要求投影必须是正交投影,且对象(用于纹理映射的表面)是正对投影平面放置的(对象与投影平面平行)。对象的放置和摄像机(观察点)的位置对投影效果都有影响。因此,对象被绘制得正对投影平面这一条件,与从正对对象得方向观察对象这一条件是需要被同时满足得。最简单得方法就是将对象绘制得与坐标轴垂直,然后顺着坐标轴得方向观察对象。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, unWidth, 0.0, unHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
此处对象指一个用于纹理映射得表面。在纹理映射过程中,纹理图会贴在该表面上。既然该表面必须正对投影平面,即它是与投影方向垂直的,那么这个表面一定是一个平面。事实上,为了与矩形纹理图配合,绘制的表面也是一个与纹理图等大的矩形。

4)设置视口和纹理图尺寸

视口选择与原点对齐,然后将视口尺寸设置成对象的尺寸



5)绘制一个与纹理图等大的矩形

“用绘制来调用”的关键步骤是:需要绘制一个与纹理图等大的矩形来作为纹理映射的对象,因为该对象的表面与纹理图的尺寸完全相同,纹理映射就可以保证覆盖纹理图的每个纹理元,且映射比例为1:1.实际上,这样映射就是数据的复制。纹理元被读取并复制到流水线的入口,进入顶点着色器。根据1:1的纹理坐标,矩形对象上的每个片段(或像素)都会被赋予对应位置纹理元的像素值。

    // set render destination
    glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
    // Hit all texels in quad.
    glPolygonMode(GL_FRONT, GL_FILL);
    // render quad with unnormalized texcoords
    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0);
    glVertex2f(0.0, 0.0);
    glTexCoord2f(unWidth, 0.0);
    glVertex2f(unWidth, 0.0);
    glTexCoord2f(unWidth, unHeight);
    glVertex2f(unWidth, unHeight);
    glTexCoord2f(0.0, unHeight);
    glVertex2f(0.0, unHeight);
    glEnd();
上面代码中设定纹理坐标时使用了非单位化的坐标值,这是因为使用的纹理种类为GL_TEXTURE_RECTANGLE_ARB,而GL_TEXTURE_2D要求单位化坐标。

6)将纹理图映射至矩形对象

7)读回数据

void transferFromTexture(float *data) {
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
    glReadPixels(0, 0, unWidth, unHeight, textureParameters.texFormat, GL_FLOAT, data);
}
乒乓技术
当算法有多个步骤时,一个步骤的计算结果是下一个步骤的输入数据时,就需要用到乒乓技术。这时。多块纹理缓存需要被分配。它们充当不同阶段的输入、输出缓存。
---------------------
作者:koibiki
来源:CSDN
原文:https://blog.csdn.net/koibiki/article/details/80353346
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马