绘制渲染缓冲区对象的内容

哈维尔·拉米雷斯(Javier Ramirez)

不太了解渲染缓冲区对象的操作。例如,如果我想显示渲染缓冲区中的内容,则必须将渲染渲染为纹理吗?

    GLuint fbo,color_rbo,depth_rbo;

    glGenFramebuffers(1,&fbo);
    glBindFramebuffer(GL_FRAMEBUFFER,fbo);

    glGenRenderbuffersEXT(1, &color_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, 256, 256);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_RENDERBUFFER_EXT, color_rb);

    glGenRenderbuffersEXT(1, &depth_rb);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 256, 256);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, depth_rb);

    if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)!=GL_FRAMEBUFFER_COMPLETE_EXT)return 1;

    glBindFramebuffer(GL_FRAMEBUFFER,0);

    //main loop    

    //This does not work :-(
    glBindFramebuffer(GL_FRAMEBUFFER,fbo);
    glClearColor(0.0,0.0,0.0,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    drawCube();
    glBindFramebuffer(GL_FRAMEBUFFER,0);

任何想法?

安东·科尔曼

当您使用FBO而不是默认帧缓冲区时,您将看不到任何东西,这是FBO的要点。

您的选择是:

  1. 将渲染缓冲区拆分为另一个帧缓冲区(在这种情况下,可能是GL_BACK默认的后缓冲区)

  2. 如果要查看结果,请绘制纹理附件,然后绘制纹理映射的图元(例如三角形/四边形)。

由于2很不言自明,因此我将更详细地解释选项1:

/* We are going to blit into the window (default framebuffer)                     */
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffer      (GL_BACK);              /* Use backbuffer as color dst.         */

/* Read from your FBO */
glBindFramebuffer (GL_READ_FRAMEBUFFER, fbo);
glReadBuffer      (GL_COLOR_ATTACHMENT0); /* Use Color Attachment 0 as color src. */

/* Copy the color and depth buffer from your FBO to the default framebuffer       */
glBlitFramebuffer (0,0, width,height,
                   0,0, width,height,
                   GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
                   GL_NEAREST);

这里有几件事值得一提:

首先,从一个帧缓冲区到另一个帧缓冲区的过渡通常比绘制两个充满整个视口的纹理三角形要慢得多。其次,当您对深度或模板图像进行模糊处理时,不能使用线性滤波...但是,如果您采用纹理映射方法,则可以使用线性滤波(这仅适用于在模糊处理时源缓冲区和目标缓冲区的分辨率不同的情况)。

总体而言,绘制带纹理的图元是更灵活的解决方案。如果需要进行“多重采样抗锯齿”,则“闪烁”最为有用,因为否则必须在着色器中实现该功能,并且在“帧缓冲区对象”之后添加了多重采样纹理处理一些较旧的硬件/驱动程序支持FBO,但不支持多样本颜色(需要DX10硬件)或深度(需要DX10.1硬件)纹理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过使用统一的缓冲区对象和实例渲染来绘制多个对象?

来自分类Dev

OpenGL绘制顶点缓冲区对象

来自分类Dev

在屏幕上绘制OpenGL渲染缓冲区

来自分类Dev

使用统一缓冲区对象的批处理渲染

来自分类Dev

WebGL 渲染缓冲区

来自分类Dev

Android位图对象作为绘制缓冲区

来自分类Dev

如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

来自分类Dev

WebGL-从内存渲染缓冲区

来自分类Dev

渲染BufferedGraphics缓冲区的特定区域

来自分类Dev

使用 Cocoa 渲染像素缓冲区

来自分类Dev

流缓冲区中的默认内容

来自分类Dev

在OpenGL中使用不同的缓冲区绘制多个对象

来自分类Dev

绘制一个对象,比较两个不同的模板缓冲区值

来自分类Dev

OpenSceneGraph:绘制半透明对象时不更新 z 缓冲区

来自分类Dev

OpenGL分层渲染和渲染缓冲区

来自分类Dev

VAO和元素缓冲区对象

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

TypeError:预期的字符缓冲区对象

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

如何设置索引缓冲区对象

来自分类Dev

预期的字符缓冲区对象错误

来自分类Dev

(阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

来自分类Dev

OpenGL ES2.0 glReadPixels()从渲染缓冲区通过帧缓冲区读取数据

来自分类Dev

多采样帧缓冲区仅在渲染缓冲区中不完整

来自分类Dev

具有多个绘制缓冲区的帧缓冲区

来自分类Dev

如何从多重采样缓冲区绘制到默认帧缓冲区

来自分类Dev

如果接收到的数据小于缓冲区的长度,则recv()写入缓冲区的内容

来自分类Dev

如何读取缓冲区中保存内容的缓冲区?

Related 相关文章

  1. 1

    如何通过使用统一的缓冲区对象和实例渲染来绘制多个对象?

  2. 2

    OpenGL绘制顶点缓冲区对象

  3. 3

    在屏幕上绘制OpenGL渲染缓冲区

  4. 4

    使用统一缓冲区对象的批处理渲染

  5. 5

    WebGL 渲染缓冲区

  6. 6

    Android位图对象作为绘制缓冲区

  7. 7

    如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

  8. 8

    WebGL-从内存渲染缓冲区

  9. 9

    渲染BufferedGraphics缓冲区的特定区域

  10. 10

    使用 Cocoa 渲染像素缓冲区

  11. 11

    流缓冲区中的默认内容

  12. 12

    在OpenGL中使用不同的缓冲区绘制多个对象

  13. 13

    绘制一个对象,比较两个不同的模板缓冲区值

  14. 14

    OpenSceneGraph:绘制半透明对象时不更新 z 缓冲区

  15. 15

    OpenGL分层渲染和渲染缓冲区

  16. 16

    VAO和元素缓冲区对象

  17. 17

    OpenGL复制顶点缓冲区对象

  18. 18

    TypeError:预期的字符缓冲区对象

  19. 19

    何时清除顶点缓冲区对象

  20. 20

    何时清除顶点缓冲区对象

  21. 21

    如何设置索引缓冲区对象

  22. 22

    预期的字符缓冲区对象错误

  23. 23

    (阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

  24. 24

    OpenGL ES2.0 glReadPixels()从渲染缓冲区通过帧缓冲区读取数据

  25. 25

    多采样帧缓冲区仅在渲染缓冲区中不完整

  26. 26

    具有多个绘制缓冲区的帧缓冲区

  27. 27

    如何从多重采样缓冲区绘制到默认帧缓冲区

  28. 28

    如果接收到的数据小于缓冲区的长度,则recv()写入缓冲区的内容

  29. 29

    如何读取缓冲区中保存内容的缓冲区?

热门标签

归档