Comments (4)
Дорый день. Для начала давайте определимся с тем, что нам нужно.
Если у нас есть низкополигональная модель, и нам нужно её выдать за гладкую, но при этом не добавлять треугольников,
то собственно для этого и были придуманы гуро-фонги.
Например, в этой модели, что вы даёте, логично определить одну нормаль на каждую вершину и спокойно их интерполировать.
Тот факт, что именно на этой модели Гуро ломается, не отменяет того, что изначально у них одни и те же цели.
Едем дальше, очень часто бывает нужно так, что нам нужно сглаживание, но не везде.
Например, если мы возьмём модель цилиндра, то мы захотим сгладить его круглый край, но стык цилиндра с основанием
сглаживать не хочется. Тогда мы на стыке определим по две нормали в каждой точке, а везде в остальных местах по одной.
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.
Тогда мы на стыке определим по две нормали в каждой точке, а везде в остальных местах по одной.
Точнее по две одинаковых (иначе нарушится параллелизм по данным), так?
Но в точке могут стыковаться не 2 полигона, а больше, как дать все нормали и не нарушить при этом параллелизм, не разбивая на разные сетки (насколько я понимаю, нам желательно отрендерить сцену как одну сетку, чтобы заюзать параллелизм на полную)?
Линейность нарушается из-за того, что у нас поверхность на деле не гладкая? В пределе при неограниченном увеличении числа вершин различие (напр. подсчитанное как сумма квадратов разности всех компонент всех пикселов) между тонировками будет стремиться к нулю?
from tinyrenderer.
Стоп. Мы говорим о разных вещах.
- Разница в тонировке гуро и фонга просто в интерполяции, в пределе они дают один и тот же результат.
- Строго говоря, для них нормаль задаётся не к вершине нашей треугольной сетки, а
к углу треугольника, прилегающего к данной вершине.
То есть, можно вообще забыть, что у нас есть много треугольников, можно ограничиться просто одним.
Мы зададим три разные нормали к трём углам треугольника, получим плавную заливку цветом, неважно, гуро или фонгом, это
мелочи.
Дальше. Если мы вдруг зададим все три нормали к углам треугольника просто равной нормали к плоскости треугольника,
то мы получим однотонный треугольник (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.
Понятно, спасибо.
from tinyrenderer.
Related Issues (20)
- [not issue] Porting of tinyrenderer to Atari 2600 HOT 1
- Implications of negative dot product of normal to the triangle and light direction HOT 3
- How to make TGA pictures HOT 1
- Incompatible with modern C++? HOT 3
- Lighting code in lesson 2 is not working properly
- Drawing triangle compilation error HOT 2
- Why does the rendered line break when it is vertical —— lesson 1 HOT 2
- Question about transformation of normal vectors in Lesson5 HOT 2
- My picture is brighter
- Where is the function of face() HOT 1
- Typo in Lesson 5
- 我渲染得到的结果是这样的,有人能告诉我这是哪里出现问题了吗 HOT 3
- Question about zbuffer HOT 2
- How to do the shadow mapping after perspective deformations? HOT 1
- Confused about design of the articles HOT 1
- In lesson2,something wrong in function `barycentric` when i run task in Vscode and i fix it. HOT 2
- The compilation error of lambda expressions in lesson 2 HOT 1
- Holes in fill a triangle using coordinates of pixel left bottom corner HOT 1
- About the function of face() HOT 1
- LLVM linker error HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tinyrenderer.