Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以将深度渲染缓冲区与立方体贴图颜色附件一起使用?_C++_Opengl_Textures_Framebuffer - Fatal编程技术网

C++ 是否可以将深度渲染缓冲区与立方体贴图颜色附件一起使用?

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

我正在尝试创建一个帧缓冲区,其中GL_纹理_立方体_贴图作为颜色附件,GL_DEPTH24_模具8作为帧缓冲区渲染缓冲区的深度附件

我相信这会起作用,就像使用GL_TEXTURE_2D颜色附件的帧缓冲区和使用GL_DEPTH24_STENCIL8作为深度组件的渲染缓冲区一样。但是,它似乎不适用于GL_纹理_立方体_贴图颜色附件,因为我遇到了帧缓冲区不完整错误。另外,请注意,我试图同时创建多个帧缓冲区

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);
}

是的,这很有效!这不会给出任何完整性错误。