看GPGPU的程序和网上的一些解释已经有了一段时间了,总在几个概念之中绕来绕去,简单总结一下,防止自己以后再看的时候又要重新看一遍。
纹理缓存:显存中的一部分,显存中有两个部分,纹理缓存和渲染缓存,我们在GPGPU中常用的是纹理缓存,在纹理缓存中我们可以放入纹理图(从内存中读进来),这个所谓的纹理图可以是图像也可以是任何数据,这样我们的显卡读写数据的时候就不用从外部的内存里面找了。
纹理对象:我们在纹理缓存中放入纹理图时通过的是glTexImage2D()或者glTexSubImage2D()这样的函数,但是如果我们在运算的过程中需要多幅纹理图,不可能还总是通过这两个函数在纹理缓存中重复得来读写,最好能让这些纹理图同时存在在纹理缓存中并且我们能够独立得调用它们,于是我们创建多个纹理对象,每个纹理对象对应一幅纹理图并单独使用,创建纹理对象用glGenTextures,用的时候就glBindTexture,不用的时候glDeleteTextures,其实纹理对象很简单,参考内存池的handle。
帧缓存对象(FBO):这个很重要,可以说是显存和内存交流的多口开关或者是桥梁,GPGPU中的关键是渲染到纹理(用渲染过程来进行数据运算),渲染到纹理的关键是将纹理缓存用帧缓存对象(FBO)封装起来,然后设置帧缓存对象而非纹理缓存为渲染对象。
这里贴一幅只要出现FBO就一定会出现的图:
用FBO封装纹理缓存的过程通过函数glFramebufferTexture2DEXT(enum target, enum attachment, enum textarget, uint texture, int level);
这个函数详细说下:
target: 帧缓存对象类型GL_FRAMEBUFFER_EXT.
attachment: 缓存的类型,讲概念的话反而不清楚,看上图,我们在GPGPU中(其他情况是不是不大清楚)一般写的 是GL_COLOR_ATTACHMENT0_EXT,GL_COLOR_ATTACHMENT1_EXT...等等。
textarget: 纹理类型,GPGPU中一般用GL_TEXTURE_RECTANGLE_ARB,因为这样的纹理图的数据坐标是一一对应的,而不是范围是[0,1]中的一个小数
texture: 纹理对象,被绑定的干活,嘿嘿
level: 纹理映射的等级,这涉及到的是3D画图的时候纹理贴图的放大缩小的问题,我们GPGPU中不管,就是0.