HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 18 сообщений этой темы на одной странице

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 писал:
Сортировка прозрачных поверхностей = боль, это закон жизни.

Появились вопросы:


Отправлено Дядя Миша 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:

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

__________________

xaerox on Vivino


Отправлено nemyax 21-01-2014 в 20:35:

Цитата:
Дядя Миша писал:
бмодели в BSP-дерево не входят

Я имел в виду заранее построить для модели дерево и порезать ей полигоны соответствующим образом. После такой подготовки будет гарантироваться корректность сортировки с любого ракурса?


Отправлено XaeroX 21-01-2014 в 20:40:

Цитата:
nemyax писал:
После такой подготовки будет гарантироваться корректность сортировки с любого ракурса?

Да.
Под "соответствующим образом" понимается отсутствие пересекающихся полигонов, а также полигонов, лежащих вне плоскостей бсп-дерева (т.е. бсп как в ку1/хл1, но НЕ ку3).

__________________

xaerox on Vivino


Отправлено nemyax 21-01-2014 в 20:52:

Цитата:
XaeroX писал:
отсутствие пересекающихся полигонов, а также полигонов, лежащих вне плоскостей бсп-дерева

В чём второе условие будет выражаться при нарезке полигонов?


Отправлено XaeroX 21-01-2014 в 21:01:

Второе при построении дерева.

__________________

xaerox on Vivino


Отправлено 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 писал:
До какой точки полигона считается расстояние до него?

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

__________________

xaerox on Vivino


Отправлено Дядя Миша 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'


Временная зона GMT. Текущее время 09:46. Страницы (2): [1] 2 »
Показать все 18 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024