Я бачу кілька широких підходів до того, як робити затінення чела:
- Копіювання та розширення моделі з перевернутими нормалями (для мене не варіант)
- Фільтр / шейдер фільтра Собеля підходить до виявлення краю
- Буфер трафарету підходить до виявлення ребер
- Шейдер для геометрії (або вершини), що обчислює нормали обличчя та ребер
Чи правильно я припускаю, що орієнтований на геометрію підхід дає найбільший контроль над освітленням та товщиною ліній, а також, наприклад. для місцевості, де ви можете бачити силуетну лінію пагорба, що поступово зливається в рівнину?
Що робити, якщо мені не потрібно піксельне освітлення на моїх місцевостях? (І я, мабуть, не буду, оскільки я планую використовувати освітлення / затінення на основі осередків на основі вершин або текстурних мап.) Чи краще мені буде дотримуватися підходу типу геометрії, чи замість цього підходитимуть до підходу простору / фрагмента екрану щоб зробити речі простішими? Якщо так, то як би я отримав "чорнило" пагорбів у межах сітчастого силуету, а не лише контур усієї сітки (без "чорнильних" деталей всередині цього контуру? (Підказки контуру , складки AKA ).
Нарешті, чи можна дешево імітувати підхід перевернутої норми, використовуючи шейдер геометрії? Я хвилююся з цього приводу, що я, безумовно, міг би дублювати кожну вершину і масштабувати їх відповідно, але як би я підходив до гортання нормалей та чіткого забарвлення в шейдері фрагмента?
Чого я хочу - різної товщини лінії з нав'язливими лініями всередині силуету ...
Чого я не хочу ...
EDIT: Подальші дослідження виявили наступне ...
Оскільки я маю велику кількість вершин на місцевості, навіть з огляду на LoD, що базується на відстані, ні перевернуті норми, ні підхід, заснований на геометрії шейдерів (навіть із винищенням фрусту), не були б розумним варіантом із-за чистої обчислювальної складності, що бере участь у дублюванні та масштабуванні всіх завантажені вершини.
Враховуючи, що мені не потрібне освітлення на один піксель у вигляді затінення суцільним тоном на поверхнях місцевості, воно також стає менш доцільним розглянути будь-які підходи, що базуються на обличчі - інакше вимога правильного освітлення поверхні - як ці природно досить дорого підрахувати. Однак правда, що вони дають найтонший ступінь контролю; наприклад, здатність відтіняти краї за допомогою "мистецьких" штрихів: Красиво, але знову ж таки, не дуже життєздатно для масово складних ігрових умов.
Буфери з трафаретом - це те, чого я б краще уникав, оскільки я вважаю за краще робити всю роботу в шейдерах. (Наведений вище приклад з червоним контуром робився за допомогою буфера трафарету - стара школа.)
Це залишає фрагменти шейдерних зображень-простору підходів. Комплексна обчислюваність зводиться до кількості фрагментів, а не до числа вершин (у моєму випадку це на 10-100x менше операцій, ніж мені довелося б робити в шейдері геометрії). Для цього потрібно більше одного пропуску візуалізації, щоб генерувати g-буфер (що складається з звичайного буфера і необов'язково також буфера глибини), до якого ми можемо застосувати фільтри розриву (наприклад, оператор Sobel). Розрив глибини - це те, що дає змогу надати контури та складки. Моя єдина суперечка при такому підході - це неможливість забезпечити більш точний контроль над заглибленими ширинами краю, хоча за допомогою правильного алгоритму в фрагменті шейдера я впевнений, що це було б можливим.
Тож питання тепер стає більш конкретним: як саме я б пішов про отримання змінної ширини краю, особливо на зовнішньому силуеті, у фрагменті шейдера?