Всё! Приаттачил текстуру глубины с трафаретом к буферу, в который сводятся все сэмплы MSAA, теперь текстура во всех случаях простая GL_TEXTURE_2D без MS :)))
glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
Остался только один вопрос - при включенном MSSA текстура буфера глубины должна сглаживаться или нет? А то она у меня выходит не сглаженная :)
Daniil Petrov
> А что это вообще за функция такая GL_MBindRect??? У меня GLEW её не понимает!
> И зачем q перед функциями GL?
это бинд ректангл текнстуры с кешированием. А q это для красоты. Просто указатель переименованый.
barnes
Кончай тырить код из Quake. Уже второй раз замечаю, ты бы хоть ради уважения подписывал, что это из Q3
0xc0de
Да не страшно :) всё равно мне этот код не помог.
Лучше бы кто подсказал - при включенном сглаживании текстура глубины должна сглаживаться или она остаётся не сглаженной?
Daniil Petrov
> Лучше бы кто подсказал - при включенном сглаживании текстура глубины должна
> сглаживаться или она остаётся не сглаженной?
что такое сглаженная глубина?
Daniil Petrov
> Лучше бы кто подсказал - при включенном сглаживании текстура глубины должна
> сглаживаться или она остаётся не сглаженной?
Она должна быть не тронутой, иначе потеряешь точность данных.
DODge
> Она должна быть не тронутой, иначе потеряешь точность данных.
Всё понял :) а то даже представления не имел, должна сглаживаться или такой оставаться.
Ну она и остаётся нетронутой при включенном сглаживании.
0xc0de
Значит так... Это не из ку3, а из 2, а во вторых это уже мои добавки и мой проект. Ясно? Вместо того чтобы с умным видом нести разную ахинею, лучше б промолчал. Глядишь за умного сошел бы...
barnes
> разную ахинею
Примеры ахинеи?
а кто написал что я копирую код из ку3? Рабинович?
barnes
> а кто написал что я копирую код из ку3
q2, q3 - без разницы, копирайты никто не отменял
Ты хоть в профиль ему загляни. Он автор чуток так известного в узких кругах quake2xp и его код вполне открыто лежит на сорсфорже.
Ещё один вопрос: где можно найти адекватный Linearize Depth, т.е. нормализацию в диапазон [0; 1]???
Сколько функций перебрал, ни одна нормально не отображает глубину сцены.
Например, чуть отойдёшь от чего-нибудь, сразу теряется в тумане :)
Или хотя бы подскажите в каких пределах хранятся числа в буфере глубины, чтобы было от чего отталкиваться.
Daniil Petrov
где можно найти адекватный Linearize Depth, т.е. нормализацию в диапазон [0; 1]
А знаешь, во фрагментном шейдере есть встроенная переменная gl_FragCoord.
Так что визуализацию глубины я делаю просто:
#version 330 out vec4 FragColor; float near = 0.1; float far = 500.0; float linear_depth (float _depth ); void main ( ) { // float depth = linear_depth ( gl_FragColor.z ); // 'тьфу, какой gl_FragColor! float depth = linear_depth ( gl_FragCoord.z ); FragColor = vec4 ( vec3 ( 10.0 * depth ), 1.0 ); // <— 10.0 for more contrast } float linear_depth ( float _depth ) { // convert from WINDOW COORDs to NORMALIZED DEVICE COORDs float z = 2.0 * _depth - 1.0; // convert from NORMALIZED DEVICE COORDs to EYE COORDs return ( 2.0 * near ) / ( far + near - z * ( far - near ) ); }
PA3UJIb
> А знаешь, во фрагментном шейдере есть встроенная переменная gl_FragCoord.
Видел в примерах, пробовал, но выходит чёрный экран. Возможно это потому, что я использую шейдер с буфером кадра без буфера глубины, она же текстура с нулевой глубиной, выводимая в ортогональной проекции при обработке постэффектов :)
Именно поэтому я и добавил текстуру глубины, чтобы её можно было передать на обработку в следующий буфер.
Кстати, у тебя почему-то написано:
float depth = linear_depth ( gl_FragColor.z );
вместо gl_FragCoord.z :))) А вообще значения этой переменной сильно отличаются от передаваемые через текстуру значения Z-буфера?
Просто я заменил gl_FragCoord.z значением текстуры глубины в твоём примере, но... либо нужно правильно настроить значение, на которое умножается linear_depth(depth)... либо тут ещё сильно влияют значения near и far...
Тема в архиве.