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的实例。
|
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 };// 初始化 glslGLuint shader = InitShader();glUseProgram(shader);// 启用FBOGLuint 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); }// 设置目标渲染bufferglDrawBuffers(tex_num, tex_buffers);// 渲染场景draw(); |
当流水管线执行结束后,数据就被储存在tex_num个纹理中。
浙公网安备 33010602011771号