Как стать автором
Обновить
552
52.2

Довожу здравый смысл до абсурда

Отправить сообщение
Почему неправильно? Именно обратно-транспонированная к (Viewport*Projection*ModelView) будет преобразовывать нормальные векторы.

Скрытый текст
строго говоря, в настоящем OpenGL шейдеры работают в не в экранных координатах, normalized device coordinates (до вьюпорта)
Строго только тонировка. В одном случае интерполирована интенсивность, во втором нормали и интенсинвость посчитана для каждго пикселя. Остальное всё строго то же самое.
Gouraud
Скрытый текст


vs Phong
Скрытый текст


совет: это надо открыть отдельно в двух вкладках и переключаться между ними
Короткий пример различия тонировок Гуро и Фонга. Вот двумерная сцена, свет падает строго сверху.
Гуро даст одинаковый цвет левой и правой вершине, и всё горизонтальное ребро будет одноцветным.

  ___
 /    \
/      \


Фонг будет интерполировать нормали и сделает самое яркое пятно в центре горизонтального ребра.
PapaBubaDiop прав, тонировка Фонга отличается от тонировки Гуро. Она дороже, но даёт лучшие результаты. В следующей статье проиллюстрирую.
Это обман зрения. Вот я в гимпе просто взял значения пикселей наугад, внутри двух треугольников и на ребре.
Скрытый текст


Человеческий глаз очень чувствителен к смене гладкости поверхности, а наши нормали всего лишь непрерывны, но никак не C1 непрерывны, и тем более не C2 непрерывны.
Пожалуйста, не надо ёрничать. Постарайтесь общаться спокойно.

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

#!/bin/sh
for i in `ls -1 *tex`; do
    rubber $i
    dvisvgm --no-fonts --scale=1.5 `basename $i tex`dvi
    rubber --clean $i
done
Маленькая заметка: засада в том, что habrastorage не ест .svg, поэтому их придётся хостить где-то снаружи.
Ок, добавляю в todo, при случае напишу отдельно.
Вам осталось сделать блики и тени. Возможно, подповерхностное рассеяние.
Да, произнесу очевидную вещь: этот артефакт будет заметен в очень специфических условиях: на очень больших (как минимум сотни пикселей на экране) треугольниках, на которые к тому же наложена текстура с сильной анизотропностью. Например, если вы наложите вместо шахматной доски на эти же треугольники текстуру песка, то проблемы нет.

Соответственно, вам решать, как именно дешевле всего разобраться с этой проблемой. Я не планировал включать его коррекцию в этот (напоминаю, краткий) курс.
Отлично! В следующий раз я причешу код, тк вызов растеризатора заставляет глаза слезиться :)
Всё оставлять в файле main уже невозможно, код становится нечитаемым.
Да, у меня будет работать как на среднем рисунке. Коррекция этогого артефакта муторная и в реальности ненужная, т.к. достаточно разделить треугольник на более мелкие, чтобы он перестал быть заметен.

Вся компьютерная графика — это наука о том, как обмануть глаз наиболее дёшево. В большинстве случаев коррекция текстуры дороже тупого подразбиения больших треугольников. Например, на нашей тествой модели вы этого эффекта не заметите, даже несмотря на то, что я не сделал ни малейшего усилия для его уменьшения.
Теперь попробуйте использовать сначала нормальные вектора к вершинам, а не к треугольникам. Они сохранены в .obj файле в строчках vn x y z и
f x/x/IVN1 x/x/IVN2 x/x/IVN3

Передаёте ровно как текстурные координаты внутрь растеризатора и интерполируете.
Интенсивность считаете внутри растеризатора в зависимости от интерполированной нормали.
Получите тонировку Фонга.
Хехе, получил сообщение о входящем комментарии ровно когда писал ответ об этой строчке кода :)
Теперь хорошая текстура
Да, точно у вас проблемы с UV, вот я обвёл треугольники, которые бросаются в глаза. Сейчас попробую ваш код посмотреть

Информация

В рейтинге
135-й
Зарегистрирован
Активность