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

Posted

技术标签:

【中文标题】(阴影贴图)将深度缓冲区渲染到纹理并绘制它以检查它【英文标题】:(Shadow Maps) Rendering the depth buffer to a texture and Drawing it to check it 【发布时间】:2013-08-05 14:54:38 【问题描述】:

我一直试图让阴影贴图工作,但我什至无法通过它的深度缓冲区部分。我已经在互联网上找了几个小时了,yadayadayada。到目前为止,这是我的代码 -

为深度制作 FBO 和纹理:

GLuint framebuffer;
    GLuint depth;
    GLuint texture;

    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1280, 800, 0, GL_RGBA, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glBindTexture(GL_TEXTURE_2D, 0);


    glGenTextures(1, &depth);
    glBindTexture(GL_TEXTURE_2D, depth);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1280, 800, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glBindTexture(GL_TEXTURE_2D, 0);




    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0);
    //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    glDrawBuffer(GL_NONE);


    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        std::cout << "There was a problem with making the framebuffer\n";
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    return framebuffer;

将“深度”渲染到四边形以供查看:

 glBindFramebuffer(GL_FRAMEBUFFER, FBO);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   for (int i = 0; i < objects.size(); i++)
   
    objects[i].renderObjectForDepth();
   
   glBindFrameBuffer(GL_TEXTURE_2D,0);
   glBindTexture2D(GL_TEXTURE_2D, texture)
   drawQuad();

对我来说,一切看起来都很好,但它会生成像所附图片一样的图像。几天来我一直在扯头发,如果有任何帮助,我们将不胜感激。

编辑:这是因为我正在渲染一个空白纹理,即从未被写入的纹理颜色。绘制深度纹理并写入颜色纹理后,它工作正常。但是没有颜色纹理怎么办呢?

【问题讨论】:

只有深度纹理的 FBO 完全有效。 @Grimmy 当我只使用深度纹理进行渲染时,纹理根本不会出现,只有当我有颜色纹理时才会出现。 哦。查看 glColorMask 你试过设置glDrawBuffer(GL_NONE)glReadBuffer(GL_NONE)只渲染深度吗? 另外,您需要在每个 OpenGL 调用之后检查glGetError() 的值,这很有指导意义。 【参考方案1】:

在渲染到仅深度的 FBO 时检查是否设置了以下两种状态:

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

【讨论】:

以上是关于(阴影贴图)将深度缓冲区渲染到纹理并绘制它以检查它的主要内容,如果未能解决你的问题,请参考以下文章

无法使用深度附件渲染到 FBO

阴影贴图未正确投影

尝试对立方体贴图纹理进行采样时出现 GL_INVALID_OPERATION

提高点光源的阴影贴图性能?

使用带有延迟渲染 Opengl 3.3 的阴影贴图的问题

WebGL:显示深度纹理