Привет всем!
Сейсас занимаюсь отображением 3D модели города (DirectX Graphics 9.0) и упёрся вот во что: полупрозрачность двух объектов при их перекрытии зависит от порядка рендеринга. Т.е. перекрытая часть дальнего объекта не рисуется в случае, если он выводится вторым (не даёт z-буфер). Если первым — всё OK, оба последовательно целиком пишутся в z-буфер, а дальше — классическая формула: FinalColor = TexelColor x SourceBlendFactor + PixelColor x DestBlendFactor. (Кстати, SourceBlendFactor == D3DBLEND_SRCALPHA и DestBlendFactor == D3DBLEND_INVSRCALPHA. Может наведёт на мысль...)
Отключать z-буфер и сортировать треугольники врукопашную — самоубийство, либо можно попрощаться с производительностью (и так 1 fps), либо отсрочить сдачу проекта на месяц... Вот что будет в любом из этих случаев:
Блин, но во всяких игрушках всё тип-топ. Как это работает?! Может кто-нить знает хитрую стратегию вывода полупрозрачных объектов? Или подскажет какую-нить бонус-возвожность DirectX, позволяющую устранить этом чОртов эффект z-буфера?
Здравствуйте, чОрт, Вы писали:
[]
Вариант:
В первую очередь рисовать непрозрачные объекты в обычном режиме, затем, отключив запись в Z-буфер, но сохранив Z-test, рисовать сортированные по глубине прозрачные
Здравствуйте, Schade, Вы писали:
S>В первую очередь рисовать непрозрачные объекты в обычном режиме, затем, отключив запись в Z-буфер, но сохранив Z-test, рисовать сортированные по глубине прозрачные
Спасибо, хорошая идея! Т.к. кол-во полупрозрачных объектов в городе обычно намного меньше, чем непрозрачных, в нашем случае это вполне прокатит как вариант. Если у кого-нить есть другие идеи, буду рад выслушать. И остаётся чисто академический интерес — как это решается в общем случае?
Здравствуйте, Ashen_Angel, Вы писали:
A_A>Вообще-то, во всех играх прозрачные полигоны сортируются ручками, есть довольно шустрые способы.
Ручкими их ни кто не ресует. Рисует их всеравно видяха. Но посылают их на отрисовку именно так как сказал Schade
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Ручкими их ни кто не ресует. Рисует их всеравно видяха. Но посылают их на отрисовку именно так как сказал Schade
В каком месте я написал, что их ручками рисовать надо?
Читай внимательней
Здравствуйте, Ashen_Angel, Вы писали:
A_A>Вообще-то, во всех играх прозрачные полигоны сортируются ручками, есть довольно шустрые способы.
Т.е. при перемещении камеры в каждом кадре нужно сортировать допустим несколько тысяч треугольников. Критерий сортировки — минимальное из расстояний от камеры каждой точки треугольника или расстояние от камеры центра треугольника... Небыстрая функция, вообщем. Время на сортировку у самых быстрых алгоритмов — O( n*log(n) ), насколько я помню. Печальная картина получается
Здравствуйте, Блудов Павел, Вы писали:
БП>Вот тут на помощь приходят BSP и Bounding Box/Sphere. Или вместе.
BSP, насколько я успел понять, используются в основном для помещений. Для открытой местности вроде города (который стоит на плоскости) я использую модификацию Q-tree. И Bounding Box для объектов, конечно. Только вот домов в Москве около 250000... А ещё есть леса с прозрачностью и много вот таких штук: . А вот такая же прелесть в wireframe: ... Нет, конечно без Q-tree было бы совсем жёстко, но и с ним треугольников для сортировки хватает. Кстати, раз пошла такая пьянка, не подскажете ли, что за фигня творится с z-буфером при пересечении объектов (см. рис 1)?
Здравствуйте, чОрт, Вы писали:
О>Кстати, раз пошла такая пьянка, не подскажете ли, что за фигня творится с z-буфером при пересечении объектов (см. рис 1)?
Вот она и творится. Дилема глубины Z-буфера.
Если она маленькая, то не видать объекты в десяти шагах.
Если большая, то вот такие артефакты и вылазят.
Лечат по-разному. В 3D вообще все всегда по-разному
Можно, например, рендерить сначала удаленные объекты с большой глубиной,
а затем туда же близкие с меньшей глубиной.
Здравствуйте, Блудов Павел, Вы писали:
БП>Если большая, то вот такие артефакты и вылазят.
Честно говоря, не знаю, как большая глубина буфера может сказаться на качестве изображения в худшую сторону... Нашёл у себя ошибку — глубина буфера всегда устанавливалась в 16 бит. 32 не поддерживается, а на 24 получилась почти идеальная картинка. I'm happy
Здравствуйте, чОрт, Вы писали:
О>Честно говоря, не знаю, как большая глубина буфера может сказаться на качестве изображения в худшую сторону... Нашёл у себя ошибку — глубина буфера всегда устанавливалась в 16 бит. 32 не поддерживается, а на 24 получилась почти идеальная картинка. I'm happy
Ну конечно, я все перепутал. Я ж имел ввиду величину far plane из Projection Matrix
Если она большая, то точность падает, зато видать за десять шагов. Если маленькая, то точнось растет,
но за счет приближения "стенки горизонта".
А установка глубины буфера в 24 бита конечно поможет (в 1.5 раза) но весщь железячно-зависимая, будьте
бдительны.
Здравствуйте, Блудов Павел, Вы писали:
БП>Ну конечно, я все перепутал. Я ж имел ввиду величину far plane из Projection Matrix БП>Если она большая, то точность падает, зато видать за десять шагов. Если маленькая, то точнось растет, БП>но за счет приближения "стенки горизонта".
Интересно... А я, не задумываясь особо, установил near plane = 1 м., far plane = 1000000 м. Но, похоже, это нормально, ибо побочных эффектов не заметно на глаз.
БП>А установка глубины буфера в 24 бита конечно поможет (в 1.5 раза) но весщь железячно-зависимая, будьте БП>бдительны.