2013-10-14 2 views
0

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

glClearDepth (0.5f);

Затем я вижу цвет в blit pass, но не данные геометрии.

Во всяком случае, как я создаю текстуру:

   glBindTexture (GL_TEXTURE_2D, _id); 
      glTexStorage2D(GL_TEXTURE_2D,1,intFmt,theWidth,theHeight);   
     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_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); 
     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); 
     glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); 


     glBindTexture(_target,0); 

Где intFmt является GL_DEPTH_COMPONENT24 или GL_DEPTH_COMPONENT32 (пробовал как ..)

Вот как я прикрепить его к FBO:

 glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer); 
     glBindTexture(GL_TEXTURE_2D, _id); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target,_id, 0); 

И это Blit фрагмент проходят шейдер:

#version 420 
layout(binding=0) uniform sampler2D COLOR_MAP_0; 
smooth in vec2 uvsOut; 
out vec4 OUTPUT; 

void main(void) { 

    ivec2 tsize = textureSize(COLOR_MAP_0, 0); 
    vec2 screntc = gl_FragCoord.xy * (1.0/vec2(tsize)); 
    OUTPUT = vec4(texture(COLOR_MAP_0, screntc).rrr ,1) ; 

} 

Возможно, я должен явно писать глубину в шейдере фрагмента?

Я попытался линеаризовать глубину в blit-фрагменте shader.It works.Now, я вижу глубину. Но я вижу белые и серые оттенки без него. В снимке: левая часть рисуется с использованием линеаризации, а справа частично из глубины текстуры. enter image description here

+0

Как вы отображаете текстуру глубины для проверки данных? Что такое ближние и дальние обрезающие плоскости и расстояние до геометрии, которую вы рисуете? – keltar

+0

Около 0,1, далеко 10000. Расстояние до геометрии составляет от 0 до 1000. Для глубины отображения я просто привязываю текстуру глубины, рисую полноэкранный квадрат с использованием frag shader, упомянутого выше. –

+0

Я не вижу ничего плохого в коде, который вы представили. Так что неправильная часть отсутствует. Вы проверили, что glGetError() равно 0, и уверены ли вы, что ваши матрицы геометрии/представления верны? – keltar

ответ

2

Кажется, все в порядке и нормально.

Вы должны иметь в виду, что DEPTH не является данными RGB или не является линейным, фактический формат зависит от того, что вы запрашиваете (в создании контекста OpenGL) или создаваемого буфера/текстуры для FBO. DEPTH - это только одноканальные данные, однако фрагментарный шейдер позволяет вам получить доступ, но вы хотите .rgb будет возвращать данные, но это будет некорректно.

Данные DEPTH, поскольку они не линейны, вы можете думать об этом, поскольку информация сжимается в более близкую часть до 1.0, поэтому большинство вещей имеют значения 0.9998 0.9997, если вы можете видеть разницу в приложениях для редактирования изображений, но опять же не так, как это должно отображаться в конце концов.

Для отображения DEPTH вам необходимо линеаризовать его, чтобы оно «имело смысл» для того, чтобы вы учитывали ближнюю/дальнюю плоскость, в этом случае White == far, Dark (Black) == close.

+0

Хорошо, я вижу, но как вы объясните, что во многих демонстрационных версиях, даже вот так: http://www.geeks3d.com/20091216/geexlab-how-to-visualize-the-depth-buffer-in-glsl/ они все еще могут использовать настоящий линеаризованный буфер глубины? –

+0

Ну, вы можете или не можете его увидеть, в зависимости от обстоятельств, как вы можете видеть здесь: https://db.tt/HKrg2TOx, если вы достаточно далеко, похоже, что его нет, хотя и не уменьшает яркость на справедливую сумму становится видимым. Это пример того, как ведут себя данные, не совместимые с дисплеем, при попытке отобразить его. Обычно вы показываете 24-битные символы без знака, буфер глубины - по крайней мере 16 бит с плавающей точкой, поэтому OpenGL будет преобразовывать его, чтобы он отображался, и это результат. Короче говоря, вы можете создать такие обстоятельства, что кажется, что вы можете отобразить необработанный буфер глубины. – DrakkLord

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