![]() |
Порядок прорисовки - Версия для печати +- Xtreme3D Community (https://xtreme3d.ru/forums) +-- Форум Xtreme3D (https://xtreme3d.ru/forums/forumdisplay.php?fid=3) +--- Форум Вопросы и ответы (https://xtreme3d.ru/forums/forumdisplay.php?fid=6) +--- Темы: Порядок прорисовки (/showthread.php?tid=67) |
Порядок прорисовки - Глеб - 03-19-2022 Возникла проблема с порядком прорисовки моделей. Я так понял в Xtreme этот порядок определяется по времени создания, то есть, то, что было создано раньше прорисовывается в первую очередь. Такое очень нужно когда используешь прозрачную воду или что-то еще. Модель, погруженная частью в воду сверху прорисовывается, а под водой остальную часть не видно. Можно ли как-то повлиять на этот порядок? В gm это определялось глубиной объектов. Те кто поверх идут с меньшей глубиной depth. Порядок прорисовки - Gecko - 03-19-2022 В Xtreme3D нет глубины объекта, порядок рендеринга определяется либо порядком создания объектов и их родителей (osInherited), либо встроенным в движок алгоритмом сортировки (osRenderFarthestFirst, osRenderNearestFirst, osRenderBlendedLast). В данном случае прозрачные объекты типа воды надо создавать после непрозрачных. Например, можно создать им глобального родителя, который идет после scene: Код: [== Неизвестный ==] Либо можно включить встроенную сортировку с учетом прозрачности: EngineSetObjectsSorting(osRenderBlendedLast), получится примерно то же самое, но видимо будет небольшая доп. нагрузка на проц (хотя я точно не измерял, насколько это существенно). Другой, более хардкорный способ: рендерить функцией ViewerRenderEx вместо обычной ViewerRender, задавая явным образом порядок. В некоторых ситуациях очень удобно. Порядок прорисовки - Глеб - 03-19-2022 Ясно. Спасибо) А как бороться с z-буфером? Когда полупрозрачные изображения на моделях пересекают друг-друга. Например куст состоит из двух полигонов, повернутых на разные углы, например на 0 и на 90. При вращении модели один полигон перекрывает другой. В gm это решалось draw_set_alpha_test и reset_volume Порядок прорисовки - Gecko - 03-19-2022 Альфа-тест делается так: MaterialSetBlendingMode('myMaterial', bmAlphaTest50); Или bmAlphaTest100, если надо вырезать альфу меньше 1 (bmAlphaTest50 - меньше 0.5) Но, кстати, в стандартных шейдерах это не поддерживается - если нужен альфа-тест в шейдере, то надо его писать самостоятельно на GLSL. Т.е. код выше сработает только для материала без шейдера. Порядок прорисовки - Глеб - 03-19-2022 Да, но только оговорка - ниже alpha test будет не отображаться вообще, а выше будет считаться полностью непрозрачным, верно? Порядок прорисовки - Gecko - 03-21-2022 Да, правильно. |