#1 2022-03-19 13:52:57

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Порядок прорисовки

Возникла проблема с порядком прорисовки моделей. Я так понял в Xtreme этот порядок определяется по времени создания, то есть, то, что было создано раньше прорисовывается в первую очередь. Такое очень нужно когда используешь прозрачную воду или что-то еще. Модель, погруженная частью в воду сверху прорисовывается, а под водой остальную часть не видно. Можно ли как-то повлиять на этот порядок? В gm это определялось глубиной объектов. Те кто поверх идут с меньшей глубиной depth.

Offline

#2 2022-03-19 14:08:55

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Порядок прорисовки

В Xtreme3D нет глубины объекта, порядок рендеринга определяется либо порядком создания объектов и их родителей (osInherited), либо встроенным в движок алгоритмом сортировки (osRenderFarthestFirst, osRenderNearestFirst, osRenderBlendedLast). В данном случае прозрачные объекты типа воды надо создавать после непрозрачных. Например, можно создать им глобального родителя, который идет после scene:

global.back = DummycubeCreate(0);
global.scene = DummycubeCreate(0);
global.transparent = DummycubeCreate(0);
global.front = DummycubeCreate(0);

Либо можно включить встроенную сортировку с учетом прозрачности: EngineSetObjectsSorting(osRenderBlendedLast), получится примерно то же самое, но видимо будет небольшая доп. нагрузка на проц (хотя я точно не измерял, насколько это существенно).

Другой, более хардкорный способ: рендерить функцией ViewerRenderEx вместо обычной ViewerRender, задавая явным образом порядок. В некоторых ситуациях очень удобно.

Offline

#3 2022-03-19 14:13:04

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Порядок прорисовки

Ясно. Спасибо)
А как бороться с z-буфером? Когда полупрозрачные изображения на моделях пересекают друг-друга. Например куст состоит из двух полигонов, повернутых на разные углы, например на 0 и на 90. При вращении модели один полигон перекрывает другой.
В gm это решалось draw_set_alpha_test и reset_volume

Редактировался Глеб (2022-03-19 14:20:33)

Offline

#4 2022-03-19 17:18:23

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Порядок прорисовки

Альфа-тест делается так: MaterialSetBlendingMode('myMaterial', bmAlphaTest50);
Или bmAlphaTest100, если надо вырезать альфу меньше 1 (bmAlphaTest50 - меньше 0.5)

Но, кстати, в стандартных шейдерах это не поддерживается - если нужен альфа-тест в шейдере, то надо его писать самостоятельно на GLSL. Т.е. код выше сработает только для материала без шейдера.

Offline

#5 2022-03-19 19:16:56

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Порядок прорисовки

Да, но только оговорка - ниже alpha test будет не отображаться вообще, а выше будет считаться полностью непрозрачным, верно?

Offline

#6 2022-03-21 08:11:24

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Порядок прорисовки

Да, правильно.

Offline

Подвал доски

Под управлением FluxBB