HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Сортировка прозрачных поверхностей (https://hlfx.ru/forum/showthread.php?threadid=4250)
Отправлено nemyax 21-01-2014 в 20:06:
Сортировка прозрачных поверхностей
Цитата:
XaeroX писал:
Сортировка прозрачных поверхностей = боль, это закон жизни.
Появились вопросы:
- Здесь имеется в виду ежекадровая сортировка?
- Существуют ли алгоритмы, которые позволяют сортировать любой меш без модификации, если известна точка зрения?
- Существуют ли алгоритмы, которые позволяют сортировать любой меш без модификации при произвольной точке зрения, или нужно BSP-резать?
- Является ли BSP-нарезка гарантией правильной сортировки?
Отправлено Дядя Миша 21-01-2014 в 20:28:
Цитата:
nemyax писал:
Здесь имеется в виду ежекадровая сортировка?
Ну мы же не можем предугадать, куда игрока понесёт в следующую секунду? Конечно ежекадровая.
Цитата:
nemyax писал:
Существуют ли алгоритмы, которые позволяют сортировать любой меш без модификации, если известна точка зрения?
Алгоритм здесь простой: берешь и сортируешь по дальности. Ничего умнее пока еще не придумали.
Цитата:
nemyax писал:
Существуют ли алгоритмы, которые позволяют сортировать любой меш без модификации при произвольной точке зрения, или нужно BSP-резать?
BSP тут никак не поможет, в самом уровне стеклянные дырки делают редко, а бмодели в BSP-дерево не входят.
Цитата:
nemyax писал:
Является ли BSP-нарезка гарантией правильной сортировки?
Только для софтварного рендерера. Аппаратному пофик, т.к. он использует Z-Buffer для сортировки непрозрачных поверхностей.
А прозрачные поверхности нельзя писать в Z-Buffer (потому что они прозрачные), вот и приходится вручную.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 21-01-2014 в 20:34:
Цитата:
nemyax писал:
Существуют ли алгоритмы, которые позволяют сортировать любой меш без модификации, если известна точка зрения?
http://en.wikipedia.org/wiki/Order-...nt_transparency
http://en.wikipedia.org/wiki/Depth_peeling
Добавлено 22-01-2014 в 03:34:
Последнюю технику я даже применял когда-то в тестах, но в движок пускать такое - да ну нафиг, сортировки обычно достаточно.__________________
Отправлено nemyax 21-01-2014 в 20:35:
Цитата:
Дядя Миша писал:
бмодели в BSP-дерево не входят
Я имел в виду заранее построить для модели дерево и порезать ей полигоны соответствующим образом. После такой подготовки будет гарантироваться корректность сортировки с любого ракурса?
Отправлено XaeroX 21-01-2014 в 20:40:
Цитата:
nemyax писал:
После такой подготовки будет гарантироваться корректность сортировки с любого ракурса?
Да.
Под "соответствующим образом" понимается отсутствие пересекающихся полигонов, а также полигонов, лежащих вне плоскостей бсп-дерева (т.е. бсп как в ку1/хл1, но НЕ ку3).__________________
Отправлено nemyax 21-01-2014 в 20:52:
Цитата:
XaeroX писал:
отсутствие пересекающихся полигонов, а также полигонов, лежащих вне плоскостей бсп-дерева
В чём второе условие будет выражаться при нарезке полигонов?
Отправлено XaeroX 21-01-2014 в 21:01:
Второе при построении дерева.
__________________
Отправлено Crystallize 22-01-2014 в 03:36:
Цитата:
XaeroX писал:
http://en.wikipedia.org/wiki/Order-independent_transparency
Цитата:
The Sega Dreamcast games console included hardware support for automatic OIT.
И это в 1998 году, за десять(!) лет до DirectX 11.
Отправлено GioHAUS0n 22-01-2014 в 08:52:
Цитата:
Crystallize писал:
The Sega Dreamcast games console included hardware support for automatic OIT.
"Зомби-Приставка" меня всегда радовала, что она была первой от PS2, GC, Xbox.
Добавлено 22-01-2014 в 18:52:
PS. Точнее 1999:
http://msdn.microsoft.com/en-us/library/ms834190.aspx
Отправлено Crystallize 22-01-2014 в 09:41:
Цитата:
GioHAUS0n писал:
PS. Точнее 1999:
В Японии вышла в 1998, в Америке-через год.
Я даже где-то видел инструкцию, не помню насколько подробную, как сделать OIT на GeForce 3, нестандартным образом используя механизм отрисовки теней.
Отправлено nemyax 22-01-2014 в 12:11:
Мне казалось, что сортировка на лету — обыденная вещь, которая есть во всех движковых рендерерах, кроме ну самых захудалых (превед, Dark Engine). А оно вон оно чё михалыч.
А в каких движках она всё-таки реализована грамотно?
Отправлено Crystallize 22-01-2014 в 13:22:
Цитата:
Дядя Миша писал:
Алгоритм здесь простой: берешь и сортируешь по дальности. Ничего умнее пока еще не придумали.
Я на этом как-то застопорился. Полигоны-это же не точки, чтобы однозначно определять расстояние до них. До какой точки полигона считается расстояние до него?
Отправлено nemyax 22-01-2014 в 13:30:
До ближайшей, судя по всему.
Отправлено XaeroX 22-01-2014 в 13:58:
Цитата:
Crystallize писал:
До какой точки полигона считается расстояние до него?
В джеке - то центра фейса.
А вообще - какую точку не возьмёшь, глюки будут при том или ином раскладе.__________________
Отправлено Дядя Миша 22-01-2014 в 15:39:
Цитата:
Crystallize писал:
The Sega Dreamcast games console included hardware support for automatic OIT.
Да пофигу на самом деле. Сейчас можно всё это через шейдеры сделать.
Цитата:
nemyax писал:
Я имел в виду заранее построить для модели дерево и порезать ей полигоны соответствующим образом
Ты понимаешь, что сортировать надо не полигоны внутри модели, а ВООБЩЕ ВСЕ полупрозрачные полигоны, которые попали во фрустум?
Без разницы какой модели они принадлежат. Иначе сортировка будет неправильной.
Цитата:
nemyax писал:
А в каких движках она всё-таки реализована грамотно?
В ксаше - более-менее грамотно, надеюсь в новом рендерере ксаш-мода будет совершенно правильной.
Цитата:
Crystallize писал:
До какой точки полигона считается расстояние до него?
Да, это правильный вопрос. Можно считать до центра, но будут глюки.
Ксаш использует механизм рассчёта не до точки, а до плоскости (PlaneDist). Это наиболее надёжный метод. Хотя тоже иногда подлагивает, например на крутящихся полупрозрачных брашах.
Есть и другие случаи, но в реальной игре вы их не встретите. Разве что в синтетическом тесте.
Добавлено 22-01-2014 в 19:39:
Вот псевдокод:
C++ Source Code:
dist = DotProduct( surface->origin, cam->forward ) - DotProduct( cam->origin, cam->forward ); |
Для каждой плоскости вычисляется вот такая дистанция, потом они сортируются через банальный qsort.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'