2013-08-05 5 views
2

Я пытаюсь заставить теневые карты работать, но я могу, даже не пропустить часть буфера глубины. Я смотрю в Интернете часами, ядаядайада. Вот мой код до сих пор -(Карты теней) Оказание буфера глубины текстуре и рисование ее, чтобы проверить ее

Создание 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; 

Rendering «Глубина» на квадроцикле для просмотра:

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

И мне, все отлично выглядит, но он генерирует изображения, подобные прикрепленному изображению. Сейчас я вырываю волосы на несколько дней, и любая помощь будет оценена по достоинству.

EDIT: Это было потому, что я рисовал пустую текстуру, IE - цвет текстуры, который никогда не был написан. После рисования текстуры глубины и записи цветной текстуры она отлично работает. Но как мне это сделать без цветовой текстуры?

The 'depth buffer being rendered'

+0

FBO только с глубины текстуры вполне допустимо. – Grimmy

+0

@Grimmy Когда я создаю только текстуру глубины, текстура вообще не появляется, только когда у меня есть цветная текстура. – BlueSpud

+0

Ох. Проверьте glColorMask – Grimmy

ответ

2

Убедитесь, что следующие два состояния устанавливаются при визуализации на глубину-только FBO:

glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 

 Смежные вопросы

  • Нет связанных вопросов^_^