Попробовал, работает.
Правда в силу доступности в настоящий момент только GL3.3 приходится немного иначить
glBindTexture (GL_TEXTURE_2D, texture ); glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, screenWidth, screenHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr ); glBindTexture ( GL_TEXTURE_2D, 0 ); glFramebufferTexture ( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texture, 0 );
PA3UJIb
Буду курочить :) а возможно содержимое рендербуфера слить в текстуру?
Хотя странно :) сейчас текстура без msaa выдала наоборот белый фон!
Daniil Petrov
Daniil Petrov
> а возможно содержимое рендербуфера слить в текстуру?
Нет.
Автор, чекай glGetError после каждого вызова, смотри debug output, чекай framebuffer completeness после аттача текстур, сделай себе макросы или шаблоны для всего этого, смотри лог компилятора и линкера шейдеров. А то так можно много времени в потёмках блуждать. На крайний случай можешь в RenderDoc'е полазить.
dayllenger
Понял :)
В случае с белой картинкой (GL_TEXTURE_2D) разобрался, пришлось добавить в шейдер следующий код:
float LinearizeDepth(float zoverw) { float n = 1.0; // camera z near float f = 20000.0; // camera z far return (2.0 * n) / (f + n - zoverw * (f - n)); } void main() { float depth = texture2D(depthImg, gl_TexCoord[0].xy).r; depth = LinearizeDepth(depth)*77; gl_FragColor = vec4(depth, depth, depth, 1.0); }
вообщето депз текстуру можно получить и без фбо....
barnes
Подскажи способ попроще
Daniil Petrov
> Ну а с чёрной картинкой (GL_TEXTURE_2D_MULTISAMPLE) уже будет проще разобраться
ну-ну
innuendo
> ну-ну
Да уж, тут тоже говна хватает :))) ну по крайней мере появилась картинка при отключенном MSAA, хотя LinearizeDepth тут явно какой-то кривой попался :)
Daniil Petrov
Знаешь, иногда полезно изучать опенсорс движки. Там много чего интересного можно накопать.
Короче. Создаешь депт текстуру.
qglGenTextures (1, &depthMap->texnum); qglBindTexture ( GL_TEXTURE_RECTANGLE, depthMap->texnum); qglTexParameteri ( GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); qglTexParameteri ( GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); qglTexParameteri ( GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); qglTexParameteri ( GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); qglTexImage2D ( GL_TEXTURE_RECTANGLE, 0, GL_DEPTH_COMPONENT24, vid.width, vid.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
void R_CaptureDepthBuffer() { if ( r_newrefdef.rdflags & RDF_NOWORLDMODEL) return; GL_MBindRect( GL_TEXTURE0, depthMap->texnum); qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE, 0, 0, 0, 0, 0, vid.width, vid.height); }
Daniil Petrov
> хотя LinearizeDepth тут явно какой-то кривой попался :)
float DecodeDepth (const in float x, const in vec2 parms) { return parms.x / (parms.y - x); }
barnes
> Знаешь, иногда полезно изучать опенсорс движки. Там много чего интересного можно накопать.
Приму к сведению!
barnes
А что это вообще за функция такая GL_MBindRect??? У меня GLEW её не понимает!
И зачем q перед функциями GL?
Daniil Petrov
> И зачем q перед функциями GL, когда ни у кого таких нету?
Ох... имена переменных хранящих указатели ну функции изменили.
Тема в архиве.