是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

斯凯尔兹

我正在尝试创建一个帧缓冲区,并使用GL_TEXTURE_CUBE_MAP作为颜色附件,并将GL_DEPTH24_STENCIL8作为深度缓冲区用于帧缓冲区的渲染缓冲区。

我坚信这会奏效,就像对带有GL_TEXTURE_2D颜色附件的帧缓冲区和以GL_DEPTH24_STENCIL8作为深度组件的渲染缓冲区一样。但是,它对于GL_TEXTURE_CUBE_MAP颜色附件似乎不起作用,因为我收到了Framebuffer Incomplete错误。另外,请注意,我正在尝试一次创建多个Framebuffer。

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

我不明白为什么会收到Framebuffer不完整的错误。我在这里想念什么吗?

拉比德76

没有。

您必须GL_TEXTURE_CUBE_MAP使用GL_DEPTH24_STENCIL8深度缓冲区附件的格式创建一个纹理例如:

glGenFramebuffers(5, &FBO[0]);
glGenTextures(5, &FBO_texture[0]);
glGenTextures(5, &FBO_depth_texture[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);

    glBindTexture(GL_TEXTURE_CUBE_MAP, FBO_depth_texture[i]);
    for (unsigned int j = 0; j < 6; j++)
    {
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, 0, GL_DEPTH24_STENCIL8, shadow_map_width, shadow_map_height, 0, GL_DEPTH_STENCIL, 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);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, FBO_depth_texture[i], 0);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        LOGGER->log(ERROR, "Renderer :  createFrameBuffers ", "Framebuffer is incomplete!");

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用帧缓冲区渲染为立方体贴图纹理

来自分类Dev

使用帧缓冲区渲染为立方体贴图纹理

来自分类Dev

OpenGL ES 2.0是否可以同时绘制深度和“颜色”缓冲区(不使用MRT)?

来自分类Dev

在OpenGL ES中使用深度和模具渲染缓冲区附件作为帧缓冲区

来自分类Dev

在WebGL中渲染缓冲区副本时是否可以指定颜色?

来自分类Dev

使用立方体贴图时的OpenGL清除缓冲区

来自分类Dev

使用颜色缓冲区时WebGL渲染失败

来自分类Dev

(阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

来自分类Dev

是否可以使用协议缓冲区序列化System.Object对象的列表

来自分类Dev

是否可以从套接字到带有“零复制”的缓冲区中的splice()?

来自分类Dev

我可以发送使用AVAudioSinkNode接收的声音缓冲区以使用AVAudioSourceNode进行实时渲染吗?

来自分类Dev

我可以使用带有所有属性(位置、法线、texCoord)的顶点缓冲区的单个顶点索引吗

来自分类Dev

是否可以在C中使用较大的char缓冲区

来自分类Dev

COLOR_ATTACHMENT's-如何在帧缓冲区对象内将多个纹理作为颜色附件渲染?

来自分类Dev

使用 Cocoa 渲染像素缓冲区

来自分类Dev

带有协议缓冲区的RPC

来自分类Dev

带有CMakeLists的协议缓冲区

来自分类Dev

是否可以将纹理作为渲染目标附加到默认帧缓冲区?

来自分类Dev

是否可以在不使用GL_OES_depth_texture的情况下对OpenGL ES深度缓冲区进行下采样?

来自分类Dev

我可以使用缓冲区的输入来运行程序吗?

来自分类Dev

WebGL 渲染缓冲区

来自分类Dev

模具传递是否写入颜色缓冲区?

来自分类Dev

是否可以区分暂存缓冲区和新的[no name]缓冲区?

来自分类Dev

为什么有时可以使用NodeJS缓冲区连接音频数据,而有时却不能呢?

来自分类Dev

是否可以使用Threejs向立方体的每个面添加不同的颜色

来自分类Dev

我是否可以在OpenGL 2.1的多个共享上下文中同时从同一缓冲区对象进行渲染?

来自分类Dev

无法使用lwjgl和顶点缓冲区渲染纹理

来自分类Dev

使用统一缓冲区对象的批处理渲染

来自分类Dev

鼠标文本选择以使用中键粘贴缓冲区

Related 相关文章

  1. 1

    使用帧缓冲区渲染为立方体贴图纹理

  2. 2

    使用帧缓冲区渲染为立方体贴图纹理

  3. 3

    OpenGL ES 2.0是否可以同时绘制深度和“颜色”缓冲区(不使用MRT)?

  4. 4

    在OpenGL ES中使用深度和模具渲染缓冲区附件作为帧缓冲区

  5. 5

    在WebGL中渲染缓冲区副本时是否可以指定颜色?

  6. 6

    使用立方体贴图时的OpenGL清除缓冲区

  7. 7

    使用颜色缓冲区时WebGL渲染失败

  8. 8

    (阴影贴图)将深度缓冲区渲染为纹理并进行绘制以进行检查

  9. 9

    是否可以使用协议缓冲区序列化System.Object对象的列表

  10. 10

    是否可以从套接字到带有“零复制”的缓冲区中的splice()?

  11. 11

    我可以发送使用AVAudioSinkNode接收的声音缓冲区以使用AVAudioSourceNode进行实时渲染吗?

  12. 12

    我可以使用带有所有属性(位置、法线、texCoord)的顶点缓冲区的单个顶点索引吗

  13. 13

    是否可以在C中使用较大的char缓冲区

  14. 14

    COLOR_ATTACHMENT's-如何在帧缓冲区对象内将多个纹理作为颜色附件渲染?

  15. 15

    使用 Cocoa 渲染像素缓冲区

  16. 16

    带有协议缓冲区的RPC

  17. 17

    带有CMakeLists的协议缓冲区

  18. 18

    是否可以将纹理作为渲染目标附加到默认帧缓冲区?

  19. 19

    是否可以在不使用GL_OES_depth_texture的情况下对OpenGL ES深度缓冲区进行下采样?

  20. 20

    我可以使用缓冲区的输入来运行程序吗?

  21. 21

    WebGL 渲染缓冲区

  22. 22

    模具传递是否写入颜色缓冲区?

  23. 23

    是否可以区分暂存缓冲区和新的[no name]缓冲区?

  24. 24

    为什么有时可以使用NodeJS缓冲区连接音频数据,而有时却不能呢?

  25. 25

    是否可以使用Threejs向立方体的每个面添加不同的颜色

  26. 26

    我是否可以在OpenGL 2.1的多个共享上下文中同时从同一缓冲区对象进行渲染?

  27. 27

    无法使用lwjgl和顶点缓冲区渲染纹理

  28. 28

    使用统一缓冲区对象的批处理渲染

  29. 29

    鼠标文本选择以使用中键粘贴缓冲区

热门标签

归档