GLSL与CUDA的互操作(1)——FBO和RTT

大家知道,在CUDA出现之前,GPU并行计算是通过shader语言实现的,即所谓的GPGPU。而如今CUDA提供了非常便捷的编程接口,所以shader语言的主要功能回归到特效渲染处理上。然而很多情况下,算法会把渲染后的数据作为并行计算的输入,这时就需要shader语言和CUDA配合起来工作。

首先,我们来讲述一下如何将场景渲染到一张或者多张纹理中,以备读取之用。
以OpenGL为例,一般情况下,经过流水管线,场景会被渲染到Framebuffer中,并最终被显示在屏幕上。除此之外,OpenGL还提供了另一种选择:将数据渲染到Framebuffer object(FBO)中,而非屏幕上。FBO中有一些存储图像数据的区域(GL_COLOR_ATTACHMENT),这些区域可以与两种类型的数据相关联,分别为Texture image和Renderbuffer image。如果将Texture image与FBO关联,称为render to texture(RTT)技术。下面我们来看一下一个RTT的实例。

C/C++ code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 可能需要用到多张纹理
GLenum tex_buffers[] = 
    GL_COLOR_ATTACHMENT0,
    GL_COLOR_ATTACHMENT1, 
    GL_COLOR_ATTACHMENT2,
    GL_COLOR_ATTACHMENT3,
    GL_COLOR_ATTACHMENT4,
    GL_COLOR_ATTACHMENT5, 
    GL_COLOR_ATTACHMENT6,
    GL_COLOR_ATTACHMENT7,
    GL_COLOR_ATTACHMENT8,
    GL_COLOR_ATTACHMENT9, 
    GL_COLOR_ATTACHMENT10,
    GL_COLOR_ATTACHMENT11,
    GL_COLOR_ATTACHMENT12,
    GL_COLOR_ATTACHMENT13, 
    GL_COLOR_ATTACHMENT14,
    GL_COLOR_ATTACHMENT15 
};
 
// 初始化 glsl
GLuint shader = InitShader();
glUseProgram(shader);
 
// 启用FBO
GLuint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
// 启用纹理
GLuint *tex = new GLuint[tex_num];
glGenTextures(tex_num, tex);
 
for (int i=0; i<tex_num; ++i)
{
    // 设置纹理参数
    glBindTexture(GL_TEXTURE_2D, tex[i]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
    // 设置纹理大小和格式
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
     
    // 将纹理绑定到FBO上
    glFramebufferTexture2D(GL_FRAMEBUFFER, tex_buffers[i], GL_TEXTURE_2D, tex[i], 0);   
}
 
// 设置目标渲染buffer
glDrawBuffers(tex_num, tex_buffers);
 
// 渲染场景
draw();



当流水管线执行结束后,数据就被储存在tex_num个纹理中。

posted on 2014-12-25 22:22  bigdudu  阅读(667)  评论(0)    收藏  举报