C++ 是否可以将深度渲染缓冲区与立方体贴图颜色附件一起使用?
我正在尝试创建一个帧缓冲区,其中GL_纹理_立方体_贴图作为颜色附件,GL_DEPTH24_模具8作为帧缓冲区渲染缓冲区的深度附件 我相信这会起作用,就像使用GL_TEXTURE_2D颜色附件的帧缓冲区和使用GL_DEPTH24_STENCIL8作为深度组件的渲染缓冲区一样。但是,它似乎不适用于GL_纹理_立方体_贴图颜色附件,因为我遇到了帧缓冲区不完整错误。另外,请注意,我试图同时创建多个帧缓冲区C++ 是否可以将深度渲染缓冲区与立方体贴图颜色附件一起使用?,c++,opengl,textures,framebuffer,C++,Opengl,Textures,Framebuffer,我正在尝试创建一个帧缓冲区,其中GL_纹理_立方体_贴图作为颜色附件,GL_DEPTH24_模具8作为帧缓冲区渲染缓冲区的深度附件 我相信这会起作用,就像使用GL_TEXTURE_2D颜色附件的帧缓冲区和使用GL_DEPTH24_STENCIL8作为深度组件的渲染缓冲区一样。但是,它似乎不适用于GL_纹理_立方体_贴图颜色附件,因为我遇到了帧缓冲区不完整错误。另外,请注意,我试图同时创建多个帧缓冲区 glGenFramebuffers(5, &FBO[0]); glGenTextures
glGenFramebuffers(5, &FBO[0]);
glGenTextures(5, &FBO_texture[0]);
glGenRenderbuffers(5, &FBO_Renderbuffer[0]);
for (unsigned int i = 0; i < 5; i++)
{
glBindTexture(GL_TEXTURE_CUBE_MAP, FBO_texture[i]);
for (unsigned int j = 0; j < 6; j++)
{
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, 0, GL_R16F, shadow_map_width, shadow_map_height, 0, GL_RED, GL_FLOAT, NULL);
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindFramebuffer(GL_FRAMEBUFFER, FBO[i]);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, FBO_texture[i], 0);
glBindRenderbuffer(GL_RENDERBUFFER, FBO_Renderbuffer[i]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, shadow_map_width, shadow_map_height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, FBO_Renderbuffer[i]);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOGGER->log(ERROR, "Renderer : createFrameBuffers ", "Framebuffer is incomplete!");
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
glGenFramebuffers(5,&FBO[0]);
glGenTextures(5,&FBO_纹理[0]);
glGenRenderbuffers(5,&FBO_Renderbuffer[0]);
for(无符号整数i=0;i<5;i++)
{
glBindTexture(GL_纹理_立方体_贴图,FBO_纹理[i]);
for(无符号整数j=0;j<6;j++)
{
GLTEXAGE2D(GL_纹理_立方体_贴图_正X+j,0,GL_R16F,阴影_贴图_宽度,阴影_贴图_高度,0,GL_红色,GL_浮动,空);
}
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\最小\过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\贴图过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ S、GL_夹紧\ u到\ u边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ T、GL_夹紧\ U到\ U边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ R、GL_夹紧\至\边缘);
glBindFramebuffer(GL_FRAMEBUFFER,FBO[i]);
glFramebufferTexture(GL_帧缓冲区,GL_颜色_附件0,FBO_纹理[i],0);
glBindRenderbuffer(GL_RENDERBUFFER,FBO_RENDERBUFFER[i]);
GLrenderBuffer存储(GL_RENDERBUFFER、GL_depth 24_模具8、阴影贴图宽度、阴影贴图高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度模板附件、GL_RENDERBUFFER、FBO_RENDERBUFFER[i]);
如果(glCheckFramebufferStatus(GL\U FRAMEBUFFER)!=GL\U FRAMEBUFFER\U COMPLETE)
记录器->日志(错误,“渲染器:createFrameBuffers”,“Framebuffer不完整!”);
glBindFramebuffer(GL_帧缓冲区,0);
glBindRenderbuffer(GL_RENDERBUFFER,0);
}
我不明白为什么会出现帧缓冲区不完整错误。我是不是遗漏了什么
您必须为深度缓冲区附件创建格式为GL\u DEPTH24\u模具8
的GL\u纹理\u立方体\u贴图。例如:
glGenFramebuffers(5,&FBO[0]);
glGenTextures(5,&FBO_纹理[0]);
glGenTextures(5,&FBO_深度_纹理[0]);
for(无符号整数i=0;i<5;i++)
{
glBindTexture(GL_纹理_立方体_贴图,FBO_纹理[i]);
for(无符号整数j=0;j<6;j++)
{
GLTEXAGE2D(GL_纹理_立方体_贴图_正X+j,0,GL_R16F,阴影_贴图_宽度,阴影_贴图_高度,0,GL_红色,GL_浮动,空);
}
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\最小\过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\贴图过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ S、GL_夹紧\ u到\ u边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ T、GL_夹紧\ U到\ U边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ R、GL_夹紧\至\边缘);
glBindTexture(GL_纹理_立方体_贴图,FBO_深度_纹理[i]);
for(无符号整数j=0;j<6;j++)
{
glTexImage2D(GL_纹理_立方体_贴图_正X+j,0,GL_深度24_模具8,阴影_贴图_宽度,阴影_贴图_高度,0,GL_深度模具,GL_浮动,NULL);
}
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\最小\过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\贴图过滤器,GL_线性);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ S、GL_夹紧\ u到\ u边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ T、GL_夹紧\ U到\ U边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ R、GL_夹紧\至\边缘);
glBindFramebuffer(GL_FRAMEBUFFER,FBO[i]);
glFramebufferTexture(GL_帧缓冲区,GL_颜色_附件0,FBO_纹理[i],0);
glFramebufferTexture(GL_帧缓冲区、GL_深度_模板_附件、FBO_深度_纹理[i],0);
如果(glCheckFramebufferStatus(GL\U FRAMEBUFFER)!=GL\U FRAMEBUFFER\U COMPLETE)
记录器->日志(错误,“渲染器:createFrameBuffers”,“Framebuffer不完整!”);
glBindFramebuffer(GL_帧缓冲区,0);
}
是的,这很有效!这不会给出任何完整性错误。