Pull to refresh

Comments 12

Orthographic projection — параллельная проекция

Не совсем. Ортографическая — частный случай параллельной, когда мы проецируем с помощью прямых на плоскость, именно перпендикулярную этим прямым.
https://toster.ru/q/345904


Теневая рябь?

Можно и так. Главное — понять, как она образуется, название не очень важно.

Не мог не положить следующее видео: ребята из nvidia сделали специальные карты с тензорными ядрами которые способны обеспечивать достаточный эффект рейтрейса. Майкрософт запилил поддержку рейтрейса в новом DX. Amd тоже что-то сейчас должно выкатить. Относительно данной статьи это — оффтоп,
но боже, как же это чертовски красиво:

В нереалтаймовой графике это есть уже 20 лет.
Каждая видяха стоит такая по 3к$.
На рынке будет через 1-2 поколения.
Всё, что на видео можно сделать кубмапами, SSR и прочим.
Это что-то типа в статью по законам Ньютона пихать видосики новых Мерседесов.
И не принёс бы, если бы не было:
Тени сложновато реализовать, особенно потому что реалтайм алгоритм для идеальных теней ещё не придуман

В оффлайн рендерах (например, cycles в блендере) для борьбы с шумом для каждого пикселя пускают много лучей (порядка тысячи, там есть примеры), они каждый раз по-разному рассеиваются и в итоге получается довольно честный результат. Но там есть свои подводные камни — источник света должен быть по возможности большим. Если он маленький и яркий, то луч света с маленькой вероятностью попадает в него, но если уж попадает, то пиксель получает слишком большую прибавку к яркости. Кстати, рендерят на видеокарте, и одна картинка приличного качества рисуется несколько минут.


Столько рассчётов 30 раз в секунду делать крайне проблематично, и заслуга nvidia больше в том, что они придумали какой-то алгоритм убирания шума. Они почти во всех примерах из вашего видео сначала показывают ужасно шумный вариант, из которого каким-то образом потом вытягивают красивую картинку.

Столько рассчётов 30 раз в секунду делать крайне проблематично

Однако реалтаймовый Octane уже скоро выходит.
Подскажите, где взять кубических текстур для шара. Я научился рисовать полупрозрачный шар, нужна почти белая текстура почти без узора (типа «шар из слоновой кости» или что-то в этом роде)
Почему используется фильтр GL_NEAREST? Я так понимаю, что при использовании GL_LINEAR зигзагообразная линия на 7-м рисунке превратится в прямую, и «муаровые узоры» исчезнут? Я немного поигрался с этим примером. Если применить линейную фильтрацию:
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

то при небольшом смещении (bias = 0.005) муаровые узоры не появляются при любых углах освещения (я менял координату Y в переменной lightPos). И это логично, что при линейной интерполяции смещение не должно зависеть от угла освещения. Углы у теней получаются слегка скругленные, а «peter panning» из-за маленького смещения почти незаметен.

Так почему не использовать линейную фильтрацию?

К сожалению, я только сейчас заметил комментарий.
Почему в оригинале используется GL_NEAREST — не знаю. Думаю, автору было так удобнее по каким-то причнам (например, более заметные артефакты теней, с которыми мы потом боролись всю статью).
Я думаю, с использованием GL_LINEAR должно работать лучше. Похожие проблемы всё равно будут возникать, только в меньшем масштабе. Например, из-за погрешности вычислений или какой-нибудь изогнутой модели из маленьких полигонов, для которой линейное приближение будет не очень точным.

Я придумал использовать GL_LINEAR, чтобы избавиться (вообще!) от одной из этих проблем — зависимости смещения от скалярного произведения dot(normal, lightDir), которое авторы статьи добавляют в шейдер. Я могу себе представить ситуацию, когда такая зависимость создает дополнительные артефакты.

Если автору использовать GL_NEAREST было удобно для статьи (и только), то он бы, может быть, написал в конце пару слов о GL_LINEAR. Я задал тот же вопрос в комментариях к оригинальной статье. Там все обсуждения велись 2-3 года назад, так что вряд ли они даже заметят. Но если ответят что-нибудь интересное, напишу здесь перевод.

Нельзя просто взять и интерполировать содержимое буфера глубины — это физически бессмысленно. Другое дело, что можно взять вместо сэмплера типа texture2D — сэмплер типа texture2DShadow, и вот тогда текстуре можно выставить GL_LINEAR чтобы получить PCF "из коробки", а не писать его самому, как делает автор. Шейдер становится проще, но теряется возможность играться с параметрами PCF для настройки размытия теней.


А ещё преобразования координат из ShadowCalculation() и bias можно впихнуть в матрицу пространства света, тогда это всё делается в вершинном шейдере, а в пиксельный попадают уже сразу готовые координаты для сэмплера.

Sign up to leave a comment.

Articles