Строго только тонировка. В одном случае интерполирована интенсивность, во втором нормали и интенсинвость посчитана для каждго пикселя. Остальное всё строго то же самое.
Короткий пример различия тонировок Гуро и Фонга. Вот двумерная сцена, свет падает строго сверху.
Гуро даст одинаковый цвет левой и правой вершине, и всё горизонтальное ребро будет одноцветным.
___
/ \
/ \
Фонг будет интерполировать нормали и сделает самое яркое пятно в центре горизонтального ребра.
Это обман зрения. Вот я в гимпе просто взял значения пикселей наугад, внутри двух треугольников и на ребре.
Скрытый текст
Человеческий глаз очень чувствителен к смене гладкости поверхности, а наши нормали всего лишь непрерывны, но никак не C1 непрерывны, и тем более не C2 непрерывны.
Пожалуйста, не надо ёрничать. Постарайтесь общаться спокойно.
Если я правильно понял, предложенный вами метод коррекции точно так же подразбивает домен текстурирования, как и просто более мелкие треугольники. Да, они не проходят через сборщик примитивов, поэтому это быстрее, но всё же.
Да, произнесу очевидную вещь: этот артефакт будет заметен в очень специфических условиях: на очень больших (как минимум сотни пикселей на экране) треугольниках, на которые к тому же наложена текстура с сильной анизотропностью. Например, если вы наложите вместо шахматной доски на эти же треугольники текстуру песка, то проблемы нет.
Соответственно, вам решать, как именно дешевле всего разобраться с этой проблемой. Я не планировал включать его коррекцию в этот (напоминаю, краткий) курс.
Отлично! В следующий раз я причешу код, тк вызов растеризатора заставляет глаза слезиться :)
Всё оставлять в файле main уже невозможно, код становится нечитаемым.
Да, у меня будет работать как на среднем рисунке. Коррекция этогого артефакта муторная и в реальности ненужная, т.к. достаточно разделить треугольник на более мелкие, чтобы он перестал быть заметен.
Вся компьютерная графика — это наука о том, как обмануть глаз наиболее дёшево. В большинстве случаев коррекция текстуры дороже тупого подразбиения больших треугольников. Например, на нашей тествой модели вы этого эффекта не заметите, даже несмотря на то, что я не сделал ни малейшего усилия для его уменьшения.
Теперь попробуйте использовать сначала нормальные вектора к вершинам, а не к треугольникам. Они сохранены в .obj файле в строчках vn x y z и
f x/x/IVN1 x/x/IVN2 x/x/IVN3
Передаёте ровно как текстурные координаты внутрь растеризатора и интерполируете.
Интенсивность считаете внутри растеризатора в зависимости от интерполированной нормали.
Получите тонировку Фонга.
vs Phong
совет: это надо открыть отдельно в двух вкладках и переключаться между ними
Гуро даст одинаковый цвет левой и правой вершине, и всё горизонтальное ребро будет одноцветным.
Фонг будет интерполировать нормали и сделает самое яркое пятно в центре горизонтального ребра.
Человеческий глаз очень чувствителен к смене гладкости поверхности, а наши нормали всего лишь непрерывны, но никак не C1 непрерывны, и тем более не C2 непрерывны.
Если я правильно понял, предложенный вами метод коррекции точно так же подразбивает домен текстурирования, как и просто более мелкие треугольники. Да, они не проходят через сборщик примитивов, поэтому это быстрее, но всё же.
Соответственно, вам решать, как именно дешевле всего разобраться с этой проблемой. Я не планировал включать его коррекцию в этот (напоминаю, краткий) курс.
Всё оставлять в файле main уже невозможно, код становится нечитаемым.
Вся компьютерная графика — это наука о том, как обмануть глаз наиболее дёшево. В большинстве случаев коррекция текстуры дороже тупого подразбиения больших треугольников. Например, на нашей тествой модели вы этого эффекта не заметите, даже несмотря на то, что я не сделал ни малейшего усилия для его уменьшения.
f x/x/IVN1 x/x/IVN2 x/x/IVN3
Передаёте ровно как текстурные координаты внутрь растеризатора и интерполируете.
Интенсивность считаете внутри растеризатора в зависимости от интерполированной нормали.
Получите тонировку Фонга.
Теперь хорошая текстура