vindast
> msaa x4 пихает за щеку всем этим txaa и ctaa с такой силой что они не нужны, а
> если появляется быстро двигающийся обьект...
Быстродвижущийся объект и сглаживать то особо не надо. Пользователь не успеет заметить там каких либо лесенок.
NVIDIA TXAA
Алгоритм использует альтернативный MSAA c фирменными временными фильтрами (temporal filters). Функционирует через проприетарную библиотеку.
Поддерживает DX11 и OpenGL4.1*, с SDK идут примеры. Требует карту скоростей (motion vectors), в SDK есть хелперы для ее получения.
Текущая версия 3.0 - документация, SDK
* - конкретно указанной версии нет, но в шейдерах из примера стоит версия 410
Daniil Petrov
> на максимальных настройках какое сглаживание самое качественное
SSAA скажем x64 и выше.
Daniil Petrov
> Я имею ввиду из стандартных реализаций :) а пока опытным путём выяснил:
А это практически из стандартных реализаций. Просто рендерь в текстуру 16К*16К, а потом ужимай до нужного тебе размера подходящий mip
MrShoor
> > 1) luma непонятная константа
> https://en.wikipedia.org/wiki/Grayscale#Luma_coding_in_video_systems
Спасибо за ликбез.
Почти разобрался с алгоритмом.
С частью кода предложенного IBets разобрался.
//Координаты отсчитываются относительно центрального пикселя vec3 rgbM = textureLod(tex, uv.xy , 0.0).xyz; //Центральный (текущий) пиксель vec3 rgbNW = textureLod(tex, uv.zw , 0.0).xyz; //Вниз влево vec3 rgbNE = textureLod(tex, uv.zw + vec2(1,0) * rcpFrame.xy, 0.0).xyz; //Вниз вправо vec3 rgbSW = textureLod(tex, uv.zw + vec2(0,1) * rcpFrame.xy, 0.0).xyz; //Вверх влево vec3 rgbSE = textureLod(tex, uv.zw + vec2(1,1) * rcpFrame.xy, 0.0).xyz; //Вверх вправо vec3 luma = vec3(0.299, 0.587, 0.114); //Grayscale константа //Переводим всю выборку пикселей в grayscale (по сути взвешиваем выборку пикселей в grayscale) float lumaNW = dot(rgbNW, luma); float lumaNE = dot(rgbNE, luma); float lumaSW = dot(rgbSW, luma); float lumaSE = dot(rgbSE, luma); float lumaM = dot(rgbM, luma); //Ищем минимальный вес пикселя из выборки float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); //Ищем максимальный вес пикселя из выборки float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
А вот дальше не понятно. Почему Dir задается таким выражением?
vec2 dir; dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));
И огромная куча магических чисел в скобках. Почему 1/3 и 2 /3 и тд. Объясните кто-нибудь.
vec3 rgbA = (1.0/2.0) * ( textureLod(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).xyz + textureLod(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).xyz ); vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( textureLod(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).xyz + textureLod(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).xyz);
vindast
(( lumaNW + lumaNE) - ( lumaSW + lumaSE)); //количество света вверху минус количество света внизу ( ( lumaNW + lumaSW) - ( lumaNE + lumaSE)); //количество света слева минус количество света справа
> Почему 1/3 и 2 /3 и тд. Объясните кто-нибудь.
4 выборки вдоль направления dir на расстояние span. Все расстояние делится на 4 равных части. Если ты произведешь действия в скобках, то увидишь, что константы в скобках прерващаются в -0.5, -0.16(6), 0.16(6), 0.5. Нанеси эти числа на числовую прямую, и увидишь, что они идут с равномерным интервалом.
Объясните это выражение, пожалуйста.
float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
vindast
> Объясните это выражение, пожалуйста.
Это я не могу объяснить по коду шейдера. Нужно читать пейпер, чтобы понять, откуда там такая функция взялась.
IBets
> // FXAA code from:
> http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/
По ссылке к сожалению только демка, код и сравнения, а по алгоритму самому ничего нет.
Придется копошить оригинал.
ЕМНИП это фхаа версии 2. Причем результат получается от применения очень поганый. 3,11 же есть, он вполне сравним с мсаа 4 по качеству на максимальных настройках.
Нашел оригинальную доку, буду ее курить пока.
Код FXAA версии 3.11.
Asaq, самое первое сообщение темы. + выцепить код из кучи ifdef задачка, учитывая что там 1000 строк.
vindast
> выцепить код из кучи ifdef задачка, учитывая что там 1000 строк.
у меня есть урезанная версия использующая только glsl и максимальные настройки сглаживания.
Тема в архиве.
Тема закрыта.