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

Macos (阴影贴图)将深度缓冲区渲染为纹理并绘制以进行检查,macos,opengl,buffer,depth,fbo,Macos,Opengl,Buffer,Depth,Fbo,我一直试图让阴影贴图工作,但我可以;我甚至无法通过它的深度缓冲区部分。我已经上网好几个小时了,Yadayada。这是到目前为止我的代码- 为深度制作FBO和纹理: GLuint framebuffer; GLuint depth; GLuint texture; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glGenTex

我一直试图让阴影贴图工作,但我可以;我甚至无法通过它的深度缓冲区部分。我已经上网好几个小时了,Yadayada。这是到目前为止我的代码-

为深度制作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;
GLuint帧缓冲区;
胶合深度;
胶合结构;
GLGEN帧缓冲区(1和帧缓冲区);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA8,1280,800,0,GL_RGBA,GL_浮点,NULL);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glBindTexture(GL_TEXTURE_2D,0);
glGenTextures(1和深度);
glBindTexture(GL_纹理_2D,深度);
GLTEXAGE2D(GL_纹理_2D,0,GL_深度_分量,1280800,0,GL_深度_分量,GL_浮点,NULL);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glBindTexture(GL_TEXTURE_2D,0);
glFramebufferTexture2D(GL_帧缓冲区,GL_深度,GL_纹理,2D,深度,0);
//glFramebufferTexture2D(GL_帧缓冲区,GL_颜色,GL_附件0,GL_纹理,GL_2D,纹理,0);
glDrawBuffer(无GLU);
如果(glCheckFramebufferStatus(GL\U FRAMEBUFFER)!=GL\U FRAMEBUFFER\U COMPLETE)

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

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

只有深度纹理的FBO是完全有效的。@Grimmy当我只使用深度纹理渲染时,纹理根本不会出现,只有当我有颜色纹理时。哦。查看GLCOLORMASK当仅渲染深度时,是否尝试设置
glDrawBuffer(GL\u NONE)
glReadBuffer(GL\u NONE)
?此外,每次调用OpenGL后,还需要检查
glGetError()
的值,这可能非常有指导意义。
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);