问题描述
我想以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 (将#修改为@)