请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 744|回复: 2

3D纹理绑定到frame buffer上为什么会有两次尝试? [复制链接]

Rank: 5Rank: 5

注册时间
2016-12-2
积分
55
发表于 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 都没有类似的操作。
        这种操作的用意何在呢?

Rank: 5Rank: 5

注册时间
2016-12-2
积分
55
发表于 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 应该是有问题的?

使用道具 举报

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

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

你说的glReadBuffer是有可能的。但目前没遇到问题,因为只有mac不支持DSA,而mac支持绑3d texture。

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-9-25 01:43 , Processed in 0.056513 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部