2013-11-10 3 views
2

Я не могу прочитать правильные значения глубины из текстуры глубины, используя функцию glreadpixels. Статус FBO завершен. другие цели рендеринга также хорошо смотрятся после того, как бьют к другому FBO.Невозможно прочитать значения глубины из текстуры глубины, прикрепленные к FBO

фрагмент кода:

// Create the FBO 
    glGenFramebuffers(1, &m_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); 

    // Create the gbuffer textures 
    glGenTextures(GBUFFER_NUM_TEXTURES, m_textures); 
    glGenTextures(1, &m_depthTexture); 

    for (unsigned int i = 0 ; i < GBUFFER_NUM_TEXTURES ; i++) { 
     glBindTexture(GL_TEXTURE_2D, m_textures[i]); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, fboWidth, fboHeight, 0, GL_RGBA, GL_FLOAT, NULL); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0); 
    } 

    // depth 
    glBindTexture(GL_TEXTURE_2D, m_depthTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, fboWidth, fboHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 
       NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0); 

    GLenum DrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; 
    glDrawBuffers(GBUFFER_NUM_TEXTURES, DrawBuffers); 

    GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

    if (Status != GL_FRAMEBUFFER_COMPLETE) { 
     printf("FB error, status: 0x%x\n", Status); 
     return 0; 
    } 


    // drawing something with depth test enabled. 
    // Now i am using glreadpixels functions to read depth values from depth texture. 

    int w = 4, h = 1; 
    GLfloat windowDepth[4]; 
    glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); 
    glReadPixels(x, y, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, windowDepth); 

ответ

1

Вы рисуете на глубину текстуры. Соответствующая функция для вызова текстуры в клиентскую память - glGetTexImage (...).

Теперь, так как нет glGetTexSubImage (...), вам необходимо выделить достаточное количество хранилищ для хранения всего LOD текстуры глубины. Нечто подобное, вероятно, сделать трюк:

GLuint w = fboWidth, h = fboHeight; 
GLfloat windowDepth [w * h]; 

glBindTexture (GL_TEXTURE_2D, m_depthTexture); 
glGetTexImage (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, windowDepth); 

Имейте в виду, что в отличие от glReadPixels (...), glGetTexImage (...) не выполняет преобразование переноса пикселей. То есть ваш формат и тип данных должны точно соответствовать типам, используемым при создании текстуры, GL не будет преобразовывать ваши данные.


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

+0

Большое спасибо за ваш ответ. Я не пытаюсь скопировать полный буфер z в клиентскую память, но я запрашиваю глубину одного пикселя, где находится моя мышь или палец. У меня есть другой вопрос. Я делаю это для орфографических и перспективных прогнозов. Результат, который я получаю от getteximage2d, - это глубина окна, если я прав. Я видел в каком-то блоге, что мне нужно линеаризовать глубину в перспективной проекции. Должен ли я линеаризовать глубину окна или что-то еще? И что еще мне понадобится, чтобы преобразовать эту глубину окна в глазное пространство z. Пожалуйста помоги. – user942502

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