Frame Buffer Object становится черным, когда включена глубина_тест - PullRequest
0 голосов
/ 28 мая 2019

Я просто пытаюсь вывести текстуру, созданную FBO, на экран, пока я гуляю по миру, поэтому эффективно делаю 2 вида сцены. Проблема заключается во всем, что отображается, пока glEnable (GL_DEPTH_TEST); отображается как черный, если я отключаю тест глубины, он работает так, как я хочу, но, очевидно, тогда у меня нет тестирования глубины.

Это вложения для моего FBO

unsigned int WaterFBO::CreateTextureAttachment(int width, int height)
{
    unsigned int texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);
    return texture;
}

unsigned int WaterFBO::CreateDepthTextureAttachment(int width, int height)
{
    unsigned int texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texture, 0);
    return texture;
}

unsigned int WaterFBO::CreateDepthBufferAttachment(int width, int height)
{
    unsigned int depthBuffer;
    glGenRenderbuffers(1, &depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
    return depthBuffer;
}

и как мне создать FBO

void WaterFBO::InitRefracBuffer()
{
    refractionFrameBuffer = CreateFrameBufferObject();
    refractionTexture = CreateTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
    refractionDepthTexture = CreateDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
    UnBindCurrentFrameBuffer();
}

только что нашел, если я закомментировал создание буфера глубины, тогда он также работает, как тест глубины отключен, поэтому я предполагаю, что он неправильно создает буфер глубины?

void WaterFBO::InitRefracBuffer()
{
    refractionFrameBuffer = CreateFrameBufferObject();
    refractionTexture = CreateTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
    //refractionDepthTexture = CreateDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
    UnBindCurrentFrameBuffer();
}
...