如何显示多重采样缓冲区中的纹理

问题描述

我想以1920 X 1080分辨率进行渲染,并且要在VGA预览上将结果显示为1920/2和1080/2

但屏幕上什么都没有显示。

这是渲染过程

因为我有6个不同的图层要渲染,所以我创建了6个不同的多采样缓冲区。

    glGenTextures(NUMBER_OF_LAYERS,textureMsaaId);
    for (int i = 0; i < NUMBER_OF_LAYERS; i++)
     {
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,textureMsaaId[i]);
        glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,msaa,GL_RGBA8,1920,1080,true);
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,0);
    }
    glGenFramebuffers(NUMBER_OF_LAYERS,fboMsaaId);
    glGenRenderbuffers(NUMBER_OF_LAYERS,rboDepthId);
    for (int i = 0; i < NUMBER_OF_LAYERS; i++)
    {
        glBindFramebuffer(GL_FRAMEBUFFER,fboMsaaId[i]);
        glBindRenderbuffer(GL_RENDERBUFFER,rboDepthId[i]);
        glRenderbufferStorageMultisample(GL_RENDERBUFFER,4,GL_DEPTH24_STENCIL8,1080);
        glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureMsaaId[i],0);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,rboDepthId[i]);
    }

我创建了一个多重采样缓冲区,它将保存多重采样缓冲区的所有数据

    glGenTextures(1,&textureIdFinalForOutputMultisample);
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,textureIdFinalForOutputMultisample);
    glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,true);

    glGenFramebuffers(1,&fboIdFinalForOutputMultisample);
    glGenRenderbuffers(1,&rboIdFinalForOutputMultisample);
    glBindFramebuffer(GL_FRAMEBUFFER,fboIdFinalForOutputMultisample);
    glGenRenderbuffers(1,&rboIdFinalForOutputMultisample);
    glBindRenderbuffer(GL_RENDERBUFFER,rboIdFinalForOutputMultisample);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER,1080);
    glFramebufferTexture2D(GL_FRAMEBUFFER,textureIdFinalForOutputMultisample,0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER,rboIdFinalForOutputMultisample);

最后要显示纹理,我创建了一个非采样帧缓冲区。

    glGenTextures(1,&textureId);
    glBindTexture(GL_TEXTURE_2D,textureId);
    glTexImage2D(GL_TEXTURE_2D,GL_RGBA,GL_UNSIGNED_BYTE,0);
    glGenFramebuffers(1,&fboId);   
    glBindFramebuffer(GL_FRAMEBUFFER,fboId);
    glGenRenderbuffers(1,&rboId);
    glBindRenderbuffer(GL_RENDERBUFFER,rboId);
    glRenderbufferStorage(GL_RENDERBUFFER,GL_TEXTURE_2D,textureId,rboId);

渲染过程

渲染层1

Bind fboMsaaId[0]
Render layer

对所有六层使用相同的方法。

将所有六个多重采样缓冲区的结果合并为1个多重采样缓冲区。

        glBindFramebuffer(GL_FRAMEBUFFER,fboIdFinalForOutputMultisample);
        for (int i = 0; i < NUMBER_OF_LAYERS; i++)
        {
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D,textureMsaaId[i]);
            glGenerateMipmap(GL_TEXTURE_2D);
            glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
            glViewport(0,SCR_WIDTH,SCR_HEIGHT);
            ResourceManager::GetShader("ScreenMultisampled").Use();
            renderQuad();
        }

这是片段着色器

#version 400 core
in vec2 TexCoord;
uniform sampler2DMS texture1;
out vec4 OutColor;

int texSamples = 4;

vec4 textureMultisample( sampler2DMS sampler,ivec2 coord )
{
    vec4 color = vec4( 0.0 );
          for( int i = 0; i < texSamples; i++ )
        color +=texelFetch( sampler,coord,i );
    color /=float(texSamples);
          return color;
}

void main()
{
   vec2 uv = vec2(0.5,0.5); // normalized coordinates
   ivec2 texSize = textureSize(texture1);
   ivec2 texCoord = ivec2(uv * texSize);
   OutColor = textureMultisample(texture1,texCoord);
}

最后使帧缓冲区变灰

glBindFramebuffer(GL_FRAMEBUFFER,fboIdFinalForOutputMultisample);
            glBindFramebuffer(GL_READ_FRAMEBUFFER,fboIdFinalForOutputMultisample);
            glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fboId);
            glBlitFramebuffer(0,GL_COLOR_BUFFER_BIT,GL_NEAREST);

并使用fboId帧缓冲区的Texture对象,并将其映射到1920/2和1080/2大小的默认帧缓冲区中的全屏Quad。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...