Перейти к содержанию
Deathman

NVidia Hashed Alpha Testing в S.T.A.L.K.E.R.

Рекомендуемые сообщения

 

В последний раз в этом году Deathman на связи и в этот раз я расскажу про то как работают объекты с прозрачностью в 3D графике и очередной крутой технологии в N.S.P.X: The Final.
Начнем с абстрактного примера:
У нас есть необходимость сделать дерево с листвой, но мы ограничены в вычислительных возможностях, так как дерево будет использоваться не для фильма, а для игры, и мы не можем сделать каждую ветку и листочек на нем отдельным набором полигонов.
Как быть?
А поступить можно следующим образом - можно замоделить полноценную ветку и запечь ее в текстуру и вместо ветки использовать текстуру ветки.
Но тут другая проблема - текстура ветки имеет фон, и если мы наложим текстуру прямо так то это будет выглядеть как картонка с рисунком.
Как убрать фон? 
А решений очень много, но в одном они все схожи.
Мы можем взять и сделать отдельную карту, по которой мы будем "обрезать фон" - эта карта называется "альфа" или более корректно Opacity map, то есть карта прозрачности.
Суть этой карты следующая - чем ярче в диапазоне [0; 1] пиксель тем менее он прозрачен.
Первый и самый очевидный подход к использованию этой карты это брать некоторое пороговое значение на соответствие с которым мы будем "тестировать" яркость пикселя альфы и если яркость ниже - "отрезать" этот пиксель и не отрисовывать его. Это называется "Alpha test"
Окей, мы добились нужного нам результата, но какой ценой? - пиксели "Отрезаются" очень грубо, получаются лесенки из пикселей, а если текстура, которую мы тестируем находится далеко и занимает мало площади в кадре - мы теряем слишком много данных и текстура получается "Обгрызанной".
С лесенками из пикселей и частично с потерей данных мы можем бороться другой технологией - alpha to coverage, которую я частично объяснял в прошлом своем посте.
При помощи ATOC данные мы теряем меньше, да, но не так мало как можно было бы.
На этом моменте в студию заходит Nvidia со своим подходом к альфа тесту.
А что если использовать не константное пороговое значение для тестирования пикселя?
Что если это значение будет меняться от пикселя к пикселю?
В таком случае это даст нам возможность терять намного меньше информации о прозрачности пикселя.
Данная технология была названа Hashed alpha testing.
Как это можно реализовать?
Я реализовал это следующим образом - я беру текстуру синего шума, для того чтобы не тратить время кадра на расчет качественного шума в реальном времени.
Ограничиваю полученное значение шума между двумя точками [0.05; 0.2] и использую его как пороговое значение для пикселя в альфа тесте. (Если пиксель карты прозрачности менее яркий чем пороговое значение - вырезаем его) 
Результат перед вами. 

Всех с наступающим новым годом, встретимся снова после новогодних праздников. 

Документ по настоящему Hashed Alpha от NVidia - https://developer.download.nvidia.com/assets/gameworks/downloads/regular/GDC17/RealTimeRenderingAdvances_HashedAlphaTesting_GDC2017_FINAL.pdf
Если вам нравятся мои посты то можете подписаться на мою группу в ВК - https://vk.com/nocturning_games
Если вы хотели бы присоединиться к разработке моего проекта напишите мне здесь или в ВК - https://vk.com/ns_deathman
LGI05inXpj4.jpg?size=1920x1080&quality=91zjH-NZQzEY.jpg?size=1920x1080&quality=9rh1HbdckSAI.jpg?size=1920x1080&quality=9vWLcoCyq2So.jpg?size=1920x1080&quality=9

Изменено пользователем Deathman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
3 минуты назад, Deathman сказал:

и очередной крутой технологии

Не дай бог. У тебя артефакты альфы текстур повылазили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
45 минут назад, Diesel сказал:

Не дай бог. У тебя артефакты альфы текстур повылазили.

Але - текстуры и технология это разные вещи. Тут проблема не в технологии, а в том какие текстуры в нее идут и как настроено пороговое значение теста этих текстур

Изменено пользователем Deathman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
10 минут назад, Deathman сказал:

а в том какие текстуры в нее идут

тогда перерисовывай текстуры под стандарт подобный DX5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, Diesel сказал:

тогда перерисовывай текстуры под стандарт подобный DX5

0_о
о_0
А в чем разница в рамках хранения альфы собственно говоря между DXT5 и каким-нибудь другим DXT, кроме того что альфа не компрессируется, а интерполируется, и когда это альфа стала делиться на "стандарты"? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
12 минут назад, Deathman сказал:

0_о
о_0
А в чем разница в рамках хранения альфы собственно говоря между DXT5 и каким-нибудь другим DXT, кроме того что альфа не компрессируется, а интерполируется, и когда это альфа стала делиться на "стандарты"? 

Ты только родился? Листва и трава DX1 всегда в оригинале нормально работала, а на высших альфа растворялась добезобразия.


Дополнено 8 минуты спустя

ss_oldfake_12-28-23_15-35-47_marsh.md.jp

Мне наверно и так достаточно.

Но замуту я твою понял, только работы дофига прибавится с перерисовкой альфы.

 

Изменено пользователем Diesel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
12 минут назад, Diesel сказал:

Ты только родился? Листва и трава DX1 всегда в оригинале нормально работала, а на высших альфа растворялась добезобразия.


Дополнено 8 минуты спустя

ss_oldfake_12-28-23_15-35-47_marsh.md.jp

Мне наверно и так достаточно.

Но замуту я твою понял, только работы дофига прибавится с перерисовкой альфы.

 

Ничего я не буду перерисовывать - я просто поднял минимально допустимое пороговое значение обрезки и теперь мы затрагиваем меньше пикселей с низким значением альфы

Более низкое пороговое значение - меньше потерь пикселей, больше артефактов от пролезания черного фона в кадрEnabled_1_low_Theshold.png?ex=659fef5f&i

Более высокое пороговое значение - больше потерянных пикселей при альфа тесте, но нет артефактов от черного фонаEnabled_1.png?ex=659fef5f&is=658d7a5f&hm

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Не, ну ты опять начал создавать десятки разных тем про фишки, которые ты добавил или собираешься добавить в свой мод

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, Supremeee сказал:

Не, ну ты опять начал создавать десятки разных тем про фишки, которые ты добавил или собираешься добавить в свой мод

0_o

Так-то я уже в которой теме подряд объясняю принципы отдельных технологий, для того чтобы люди с мозгами их реализовывали у себя, а не просто понтуюсь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Поясните для васяна, то шо расписано в многабукав поможет исправить проблему пикселизации листвы вдалеке? Я думал за это какое-то сглаживание отвечает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
5 минут назад, AfterGlow сказал:

Поясните для васяна, то шо расписано в многабукав поможет исправить проблему пикселизации листвы вдалеке? Я думал за это какое-то сглаживание отвечает.

Hashed alpha testing позволяет избавиться от потерь данных при альфа тесте, а также позволяет использовать градиентную альфу. 


Дополнено 7 минуты спустя
14 минут назад, AfterGlow сказал:

Поясните для васяна, то шо расписано в многабукав поможет исправить проблему пикселизации листвы вдалеке? Я думал за это какое-то сглаживание отвечает.

Вот видеосравнение обычного альфа теста и более продвинутых вариаций

 

 


Дополнено 23 минуты спустя
29 минут назад, AfterGlow сказал:

Поясните для васяна, то шо расписано в многабукав поможет исправить проблему пикселизации листвы вдалеке? Я думал за это какое-то сглаживание отвечает.

Хочу дополнить - сглаживания не могут восстановить потерянные пиксели 

Альфа тест происходит на этапе материала, в текстурном пространстве самой текстуры, а сглаживания работают на этапе постобработки, в текстурном пространстве всего кадра. И когда мы на этапе материала потеряли пиксели - мы уже не сможем их восстановить на постобработке

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Deathman это шейдеры только или еще двиг надо править? Я подумал, что мне это надо. В чн вообще жопа с пикселями.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, Diesel сказал:

Deathman это шейдеры только или еще двиг надо править? Я подумал, что мне это надо. В чн вообще жопа с пикселями.

 

В случае с оригинальными шейдерами просто везде где используется clip(прозрачность - def_aref) заменяешь def_aref на шум. Поэкперементируй с плотностью шума и его минимальным и максимальным зачениями.

У меня всё проще - у меня это дело одной функции, которая вызывается из двух шейдеров

Изменено пользователем Deathman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
22 часа назад, Deathman сказал:

шум

В ЧН R3 шейдерах не вижу объявления noise. 

Где то нашел левый шейдер, там есть типа

float noise  = frac(sin(dot(tc0, float2(12.0, 78.0) + (timers.x*1.17f) )) * 43758.0); 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, Diesel сказал:

В ЧН R3 шейдерах не вижу объявления noise. 

Где то нашел левый шейдер, там есть типа

float noise  = frac(sin(dot(tc0, float2(12.0, 78.0) + (timers.x*1.17f) )) * 43758.0); 

 

---___---

В чистом небе и нет шума, кроме как из текстуры. А тот что ты скинул во-первых темпоральный, во-вторых он очень тяжёлый, так как использует одновременно три тяжёлых функции. Возьми какую-нибудь текстуру с шумом и выведи ее в шейдеры и используй его. Это даст быстрый шум, скорость получения которого равна скорости чтения из текстуры и который ты можешь в последствии докастомизировать под себя

Изменено пользователем Deathman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
8 минут назад, Deathman сказал:

---___---

В чистом небе и нет шума, кроме как из текстуры. А тот что ты скинул во-первых темпоральный, во-вторых он очень тяжёлый, так как использует одновременно три тяжёлых функции. Возьми какую-нибудь текстуру с шумом и выведи ее в шейдеры и используй его. Это даст быстрый шум, скорость получения которого равна скорости чтения из текстуры и который ты можешь в последствии докастомизировать под себя

А почему бы не заюзать такой шум, с текстуры хорошо конечно, но а если нужен случайный шум, чисто по uv двигать его предлагаешь ?

https://www.shadertoy.com/view/XlXcW4

Я тут мимо ходом, мож чего нового для себя узнаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, fubakabaka1 сказал:

А почему бы не заюзать такой шум, с текстуры хорошо конечно, но а если нужен случайный шум, чисто по uv двигать его предлагаешь ?

https://www.shadertoy.com/view/XlXcW4

Я тут мимо ходом, мож чего нового для себя узнаю

Конкретно здесь используются битовые операции, а значит автоматически DX10+

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
Только что, Deathman сказал:

Конкретно здесь используются битовые операции, а значит автоматически DX10+

Так а зачем нам поддерживать старье на DX младше 11 Kappa (Да я видел что там чн, ето прикол такой)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, fubakabaka1 сказал:

Так а зачем нам поддерживать старье на DX младше 11 Kappa (Да я видел что там чн, ето прикол такой)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
Только что, Deathman сказал:

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

Ну да, лучше же хранить легаси до того пока проект вообще не превратиться в кашу. Так что стреляешь в ногу себе еще и ты, поддерживая устаревшее API. Хочешь старое, делай GL рендер, хочешь новое: Вулкан или DX-11-12 в помощь. Вот уже бы давно можно было движок хорошо развить, но вы чет любите некрофилию какую то. Без обид, я и сам раньше занимался кодом на DX8-9, но это уже нафиг никому не нужно, кроме полтора колек с железом с нулевых. Да и то, для них тоже можно что нибудь придумать, чтобы и у них работало. Без использования совсем уже устаревшего апи.


Дополнено 0 минут спустя

Да и емае, зачем копаться в графике с таким подходом. Юзай дефолтный рендер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
20 минут назад, fubakabaka1 сказал:

А почему бы не заюзать такой шум, с текстуры хорошо конечно, но а если нужен случайный шум, чисто по uv двигать его предлагаешь ?

Не знал куда его приспособить. На тени херово. 

А вот на воду. тут есть что то интересное. Можно новый материал создать.

ss_oldfake_12-30-23_15-36-42_marsh.md.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 минуту назад, Diesel сказал:

Не знал куда его приспособить. На тени херово. 

А вот на воду. тут есть что то интересное. Можно новый материал создать.

ss_oldfake_12-30-23_15-36-42_marsh.md.jp

В целом да, можно этакий пастрейс сделать, может ошибаюсь конечно. Правда этот шум же замазывать надо..


Дополнено 2 минуты спустя

Кст, дизель. Крутые штуки графические делаешь для чн

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, Diesel сказал:

Не знал куда его приспособить. На тени херово. 

А вот на воду. тут есть что то интересное. Можно новый материал создать.

ss_oldfake_12-30-23_15-36-42_marsh.md.jp

Нах*й, а главное зачем ты начал цеплять шум к чему только не попадя?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 минуту назад, Deathman сказал:

Нах*й, а главное зачем ты начал цеплять шум к чему только не попадя?

just for lulz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
3 минуты назад, fubakabaka1 сказал:

В целом да, можно этакий пастрейс сделать, может ошибаюсь конечно. Правда этот шум же замазывать надо..

Path tracing - это не шум сам по себе, это сложный алгоритм трассировки виртуальных лучей. Мы можем использовать шум, но это не шум сам по себе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу