Git Product home page Git Product logo

Comments (4)

ssloy avatar ssloy commented on May 13, 2024

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

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

Едем дальше, очень часто бывает нужно так, что нам нужно сглаживание, но не везде.
Например, если мы возьмём модель цилиндра, то мы захотим сгладить его круглый край, но стык цилиндра с основанием
сглаживать не хочется. Тогда мы на стыке определим по две нормали в каждой точке, а везде в остальных местах по одной.

On 15-01-28 09:12:21, KOLANICH wrote:

Здравствуйте.
http://habrahabr.ru/post/248723/#comment_8241713
1 Если у нас по 1 нормали к каждой точке, то мы неверно выразим негладкую
поверхность (у которой нормали в особых точках вообще не существует). Вывод - к
стыкам должно быть столько нормалей, сколько полигонов там стыкуются. То есть
односторонние пределы. В вашем примере должно быть по 2 нормали: одна - на
боковую сторону, другая - на верхнее основание. Тогда тонировки Фонга и Гуро
должны дать одинаковые результаты в силу линейности умножения.
Как вообще получают нормали к особым точкам, если их не существует, а они
нужны?

2 Если же возьмём по 1й нормали, то либо верхнее основание будет затонированно
неправильно (если возьмём нормали к боковым сторонам), либо боковые стороны
(если возьмём нормали к верхнему основанию), либо всё будет затонированно
неправильно.

3 И неплохо бы заполнить хабрапрофиль, в частности контактные данные, так как
не все могут на Хабре писать.


Reply to this email directly or view it on GitHub.*

from tinyrenderer.

KOLANICH avatar KOLANICH commented on May 13, 2024

Тогда мы на стыке определим по две нормали в каждой точке, а везде в остальных местах по одной.

Точнее по две одинаковых (иначе нарушится параллелизм по данным), так?
Но в точке могут стыковаться не 2 полигона, а больше, как дать все нормали и не нарушить при этом параллелизм, не разбивая на разные сетки (насколько я понимаю, нам желательно отрендерить сцену как одну сетку, чтобы заюзать параллелизм на полную)?

Линейность нарушается из-за того, что у нас поверхность на деле не гладкая? В пределе при неограниченном увеличении числа вершин различие (напр. подсчитанное как сумма квадратов разности всех компонент всех пикселов) между тонировками будет стремиться к нулю?

from tinyrenderer.

ssloy avatar ssloy commented on May 13, 2024

Стоп. Мы говорим о разных вещах.

  1. Разница в тонировке гуро и фонга просто в интерполяции, в пределе они дают один и тот же результат.
  2. Строго говоря, для них нормаль задаётся не к вершине нашей треугольной сетки, а
    к углу треугольника, прилегающего к данной вершине.

То есть, можно вообще забыть, что у нас есть много треугольников, можно ограничиться просто одним.
Мы зададим три разные нормали к трём углам треугольника, получим плавную заливку цветом, неважно, гуро или фонгом, это
мелочи.

Дальше. Если мы вдруг зададим все три нормали к углам треугольника просто равной нормали к плоскости треугольника,
то мы получим однотонный треугольник (flat shading).

Теперь представим два треугольника, которые имеют общее ребро. Мы дадим три одинаковые нормали одному треугольнику
и три других, но тоже одинаковых нормали второму треугольнику. Мы по-прежнему остались в режиме тонировки flat shading,
тем самым создав чёткое ребро между поверхностями. Но при этом мы бы могли на общем ребре дать общие нормали, тогда бы
мы сгладили переход от одного треугольника к другому. Но это не отменяет того факта, что у нас все треугольники живут
своей отдельной жизнью.

Вот пример - модель у нас абсолютно одна и та же, но
в левой картинке мы на вершину (точнее, на все углы, прилежащие к вершине) даём одну нормаль.
А в правой - мы разным углам, прилежащим к вершине, даём разные нормали.

http://wiki.polycount.com/w/images/5/51/BenMathis_SmoothingGroups_Excerpt.gif

On 15-01-29 12:21:32, KOLANICH wrote:

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

Линейность нарушается из-за того, что у нас поверхность на деле не гладкая? В
пределе при неограниченном увеличении числа вершин различие (напр. подсчитанное
как сумма квадратов разности всех компонент всех пикселов) между тонировками
будет стремиться к нулю?


Reply to this email directly or view it on GitHub.*

from tinyrenderer.

KOLANICH avatar KOLANICH commented on May 13, 2024

Понятно, спасибо.

from tinyrenderer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.