Render.ru

Shader antialiasing

#1
Я эту просьбу на www.rusrender.net запостил, но там как-то пустынно... Суть вот в чем. Добрался я до реальной необходимости антиалиасинга в шейдере и - опять же - практически одновременно - читаю об этом в ArMan. А там - интеграл на интеграле сидит и им же погоняет. Ну, а я после первого курса института с ними так и не пообщался ни разу. А лет с тех пор прошло... Короче, общая концепция понятна, что сэмплить надо не точку, а некий объем или площадь, а как у них для этого там формула образовалась - непонятно. Если кто может, пожалуйста объясните и попроще, очень прошу!
 
#2
Всем привет.

На самом деле все достаточно просто - не вдаваясь в армановские подробности, благо я его дома забыл :)

Если мы пишем не антиалиасеные шейдеры, то мы определяем закраску (для surface) точки как некую дискретную величину, не зависящую от величин для соседних точек. При написании антиалиасенных шейдеров мы должны учитывать соседей - и вот где на арену вступают все эти интегралы. То есть на самом деле мы суммируем ("интегрируем") величину цвета по поверхности, используя для этого предсказание значения следующей точки, и используем средний результат.

Я так понимаю, вопросы все еще могут возникать, поэтому есть 2 предложения:

1. я посмотрю в arman на предмет крутости тамошних интегралов (к стыду, я пока принимал все на веру и все работало...) и напишу чего-нибудь более подробное

2. можно посмотреть такие первоисточники:
http://www.renderman.org/RMR/Books/sig92.course21.pdf
http://www.bmrt.org/arman/materials.html
http://www.mailgate.org/comp/comp.graphics.rendering.renderman/msg02743.html

Кстати, армановская глава про антиалиасинг практически совпадает к сигграфовским курсом за 92 год.
 
#4
После 48-го прочтения главы смысл дошел. Но остался вопрос - имеет ли все это отношение к дисплейсменту? Сам по себе вопрос абсурдный - но все же: с одной стороны, отсутствие антиалиасинга в дисплейсмент шейдере может (?) привести к драным краям, с другой стороны, представьте себе тот самый "полосатый" шейдер в качестве дисплейсмента. Если в первоначальном варианте антиалиасинг "на горизонте" приводил к смешиванию черных и белых полос в 50%-серые пикселы, то в дисплейсменте что - деформация должна доантиалиаситься до нуля?
 
#5
Ты монстр - я понял только через 2 месяца...

Что касаемо вопроса - имхо, так оно и будет, только это будет на таком расстоянии от камеры, что ты не заметишь разницы.

Хотя я на самом деле потрекаю по этому поводу c.g.r.r, может, чего умнее скажут...
 
#6
Мысли читаешь? Я только что в c.g.r.r забросил этот вопросец :)
А насчет большого расстояния от камеры - отнюдь: представь checker с огромным Kdisp, наложенный на плоскость "до горизонта". Тут скорее надо делать не averaging, а max...

А про монстра - это ты зря, на самом деле я разобрался только с простейшим случаем - четкой границей между двумя цветами, (в футбольном мячике уже применил), а общий случай так пока и остался загадкой...
 
#7
Что касаемо глав которые вы обсуждаете - то я их не читал :), однако про дисплейсмент могу сказать - так и есть, на большом растоянии он уходит в ноль. Приходится увеличивать шейдинг рейт до значений порядка 0.25-0.1, что увеличивает время рендеринга в несколько раз. Таких значениях ШР действительно в большинстве случаев, даже при экстремальных значениях дисплейсмента, достаточно. Например когда-то давно, когда еще небыло разнообразных фуров и тому подобного, таким образом моделил травку (просьба не издеваться - это было лет пять назад, когда РМан был только в виде бетты на маке, а Силики были не доступны по цене).
Кстати дисплейсмент вообще штука неоднозначная, например в случае анимации очень осторожно надо обращаться с текстурами с жестким рисунком, и стараться использовать правильный тип фильтрации - ребята из пиксара ввели такой (помоему radial-bspline), но в слиме нет возможности выбирать фильтрацию (по умолчанию вроде идет box). :(( Пришлось переписать темплейт.
 
#8
Чекер с огромным Kdisp - ты уж извини, но это изврат - делать огромные изменения геометрии дисплейсментом.

Даже извращенцы Disney, пока педалии динозавров, диспы делали слоями и старались сильно от начальной поверхности не удаляться - об этом в последнем сигграфе написано очень даже четко.

Поэтому - прости еще раз - аргумент не принимается ;-)
 
#9
Согласен, что это не применимо на практике, но в теории - частный экстремальный случай - это то, чем проверяется универсальность алгоритма. Сурфейс антиалиасинг ведь тоже легче проверить на частном случае типа Армановского pulsetrain.
 
Сверху