Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Вопрос #1

Closed
KOLANICH opened this issue Jan 28, 2015 · 4 comments
Closed

Вопрос #1

KOLANICH opened this issue Jan 28, 2015 · 4 comments

Comments

@KOLANICH
Copy link

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

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

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

@ssloy
Copy link
Owner

ssloy commented Jan 28, 2015

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

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

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

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.*

@KOLANICH
Copy link
Author

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

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

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

@ssloy
Copy link
Owner

ssloy commented Jan 29, 2015

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

  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.*

@KOLANICH
Copy link
Author

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

@ssloy ssloy closed this as completed Jan 25, 2016
ssloy added a commit that referenced this issue Feb 23, 2025
ssloy added a commit that referenced this issue Feb 25, 2025
ssloy added a commit that referenced this issue Feb 25, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants