Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Порядок прорисовки
#1
Возникла проблема с порядком прорисовки моделей. Я так понял в Xtreme этот порядок определяется по времени создания, то есть, то, что было создано раньше прорисовывается в первую очередь. Такое очень нужно когда используешь прозрачную воду или что-то еще. Модель, погруженная частью в воду сверху прорисовывается, а под водой остальную часть не видно. Можно ли как-то повлиять на этот порядок? В gm это определялось глубиной объектов. Те кто поверх идут с меньшей глубиной depth.
Ответ
#2
В 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, задавая явным образом порядок. В некоторых ситуациях очень удобно.
Ответ
#3
Ясно. Спасибо)
А как бороться с z-буфером? Когда полупрозрачные изображения на моделях пересекают друг-друга. Например куст состоит из двух полигонов, повернутых на разные углы, например на 0 и на 90. При вращении модели один полигон перекрывает другой.
В gm это решалось draw_set_alpha_test и reset_volume
Ответ
#4
Альфа-тест делается так: MaterialSetBlendingMode('myMaterial', bmAlphaTest50);
Или bmAlphaTest100, если надо вырезать альфу меньше 1 (bmAlphaTest50 - меньше 0.5)

Но, кстати, в стандартных шейдерах это не поддерживается - если нужен альфа-тест в шейдере, то надо его писать самостоятельно на GLSL. Т.е. код выше сработает только для материала без шейдера.
Ответ
#5
Да, но только оговорка - ниже alpha test будет не отображаться вообще, а выше будет считаться полностью непрозрачным, верно?
Ответ
#6
Да, правильно.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 3 Гость(ей)