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

adagio_chen 2014-06-12 11:17:16
加精
大家知道,在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的实例。



// 可能需要用到多张纹理
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个纹理中。
...全文
1751 73 打赏 收藏 转发到动态 举报
写回复
用AI写文章
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
543yl 2014-06-23
  • 打赏
  • 举报
回复
支持中长期合作
qq_16778901 2014-06-23
  • 打赏
  • 举报
回复
qq_16719759 2014-06-23
  • 打赏
  • 举报
回复
学习到了 厉害!!!
baidu_16793483 2014-06-23
  • 打赏
  • 举报
回复
学习!!很厉害的样子
qq_16756363 2014-06-22
  • 打赏
  • 举报
回复
关注 kakaxi_11 kakaxi_11 等级:Blank #50 得分:0 回复于: 2014-06-20 10:23:17 不错不错
一头祸水 2014-06-22
  • 打赏
  • 举报
回复
范德萨范德萨范德萨发生的范德萨
LIUS66 2014-06-22
  • 打赏
  • 举报
回复
edwincui 2014-06-22
  • 打赏
  • 举报
回复
学习了,不错。
qq1015988818 2014-06-22
  • 打赏
  • 举报
回复
不错不说
qq_16747455 2014-06-22
  • 打赏
  • 举报
回复
牛 去
mmsx 2014-06-22
  • 打赏
  • 举报
回复
学习了,需要学习的东西越来越多了
phenixflysky 2014-06-21
  • 打赏
  • 举报
回复
学习一下!
qq_16753209 2014-06-21
  • 打赏
  • 举报
回复
此乃大神!!!!
qq_16708753 2014-06-20
  • 打赏
  • 举报
回复
第一次接触CUDA,希望后期可以好好用上。
kakaxi_11 2014-06-20
  • 打赏
  • 举报
回复
不错不错
w28506620 2014-06-20
  • 打赏
  • 举报
回复
好的 受教了 谢谢分享
fhdslhj2006 2014-06-20
  • 打赏
  • 举报
回复
很不错谢谢啦
longchen 2014-06-19
  • 打赏
  • 举报
回复
厉害,shoujiaole
我儿叫子麟 2014-06-19
  • 打赏
  • 举报
回复
储存在tex_num个纹理中
hu0775 2014-06-19
  • 打赏
  • 举报
回复
加载更多回复(41)

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧