中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 2252|回复: 2

3D纹理绑定到frame buffer上为什么会有两次尝试?

[复制链接]
发表于 2017-8-28 21:27:54 | 显示全部楼层 |阅读模式
        void OGLTexture3DRenderView::OnAttached(FrameBuffer& fb, uint32_t att)
        {
                BOOST_ASSERT(att != FrameBuffer::ATT_DepthStencil);

                index_ = att - FrameBuffer::ATT_Color0;

                OGLRenderEngine& re = *checked_cast<OGLRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance());
                fbo_ = checked_cast<OGLFrameBuffer*>(&fb)->OGLFbo();
                if (glloader_GL_EXT_direct_state_access())
                {
                        if (0 == copy_to_tex_)
                        {
                                glNamedFramebufferTexture3DEXT(fbo_,
                                        GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, tex_, level_, slice_);

                                GLenum status = glCheckNamedFramebufferStatusEXT(fbo_, GL_FRAMEBUFFER);
                                if (status != GL_FRAMEBUFFER_COMPLETE)
                                {
                                        glGenTextures(1, &tex_2d_);
                                        re.BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
                                        glTextureImage2DEXT(tex_2d_, GL_TEXTURE_RECTANGLE_ARB,
                                                           0, GL_RGBA32F_ARB,
                                                           width_, height_, 0,
                                                           GL_RGBA, GL_FLOAT, nullptr);

                                        copy_to_tex_ = 2;
                                }
                                else
                                {
                                        copy_to_tex_ = 1;
                                }
                        }

                        if (1 == copy_to_tex_)
                        {
                                glNamedFramebufferTexture3DEXT(fbo_,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_3D, tex_, level_, slice_);
                        }
                        else
                        {
                                BOOST_ASSERT(2 == copy_to_tex_);

                                glNamedFramebufferTexture2DEXT(fbo_,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_RECTANGLE_ARB, tex_2d_, 0);
                        }
                }
                ...
          }
        这是 OGLTexture3DRenderView 类的 OnAttached 函数。
        有一处不明,为什么要首先将 3D 纹理绑定到 GL_COLOR_ATTACHMENT0 位置上,然后进行检查。如果不对,再绑定到 att 位上。而其他比如 1D、 2D、 CubeMap 都没有类似的操作。
        这种操作的用意何在呢?
 楼主| 发表于 2017-8-28 21:59:20 | 显示全部楼层
本帖最后由 shenruiyao 于 2017-8-28 22:01 编辑

        void OGLTexture3DRenderView::OnDetached(FrameBuffer& fb, uint32_t att)
        {
                KFL_UNUSED(fb);

                BOOST_ASSERT(att != FrameBuffer::ATT_DepthStencil);

                if (glloader_GL_EXT_direct_state_access())
                {
                        BOOST_ASSERT(copy_to_tex_ != 0);
                        if (1 == copy_to_tex_)
                        {
                                glNamedFramebufferTexture3DEXT(fbo_,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_3D, 0, 0, 0);
                        }
                        else
                        {
                                BOOST_ASSERT(2 == copy_to_tex_);

                                glNamedFramebufferTexture2DEXT(fbo_,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_RECTANGLE_ARB, 0, 0);

                                this->CopyToSlice(att);
                        }
                }
                else
                {
                        OGLRenderEngine& re = *checked_cast<OGLRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance());
                        re.BindFramebuffer(fbo_);

                        BOOST_ASSERT(copy_to_tex_ != 0);
                        if (1 == copy_to_tex_)
                        {
                                glFramebufferTexture3D(GL_FRAMEBUFFER,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_3D, 0, 0, 0);
                        }
                        else
                        {
                                BOOST_ASSERT(2 == copy_to_tex_);

                                glFramebufferTexture2D(GL_FRAMEBUFFER,
                                                GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0,
                                                GL_TEXTURE_RECTANGLE_ARB, 0, 0);

                                this->CopyToSlice(att);
                        }

                        re.BindFramebuffer(0);
                }
        }


        void OGLTexture3DRenderView::CopyToSlice(uint32_t att)
        {
                BOOST_ASSERT(att != FrameBuffer::ATT_DepthStencil);

                glReadBuffer(GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0);

                OGLRenderEngine& re = *checked_cast<OGLRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance());
                re.BindTexture(0, GL_TEXTURE_3D, tex_);
                glCopyTexSubImage3D(GL_TEXTURE_3D, level_, 0, 0, slice_, 0, 0, width_, height_);
        }

        另外,还有一个问题,在 OnDetached 中,DSA 和 非 DSA 的实现都调用了 CopyToSlice 函数,而这个函数使用了 glReadBuffer,而 glReadBuffer 的量是 per frame 的。那么如果实现使用的是 DSA,没有 glBindFrameBuffer 操作,glReadBuffer 应该是有问题的?

发表于 2017-9-9 11:37:01 | 显示全部楼层
这是因为在一些古老的硬件上,需要这样来规避驱动问题。先试一下,如果连0都绑不了,那就退回到copy的方法。否则就执行正确的绑到指定rt上。

你说的glReadBuffer是有可能的。但目前没遇到问题,因为只有mac不支持DSA,而mac支持绑3d texture。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-5-23 07:15 , Processed in 0.040355 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表