Может ли Stage3D рисовать объекты позади всех остальных независимо от фактического расстояния?

Я создаю трехмерную космическую игру в Stage3D и хочу, чтобы за ВСЕМИ другими объектами было нарисовано звездное поле. Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, что расстояния очень велики. Если у меня действительно есть звезды намного дальше, чем другие объекты, я должен масштабировать их до такой степени, чтобы они не отображались правильно - выше определенного размера лица кажутся мерцающими. То же самое происходит и с сетками моей планеты, если масштабировать их до необходимых размеров (12000-100000 единиц в поперечнике). Я визуализирую звезды на плоских текстурах, обращенных лицом к камере. Пока они не слишком увеличены в масштабе, они отображаются хорошо, хотя явно перед другими объектами, находящимися дальше. Я пробовал всевозможные режимы depthTestModes (Context3DCompareMode.LESS, Context3DCompareMode.GREATER и все другие) в сочетании с включением и исключением сетки в z-буфере, чтобы звезды отображались только в том случае, если НЕТ других пикселей там, где звезда могла бы появляются, без везения. Кто-нибудь знает, как я могу этого добиться - или, что еще лучше, знает, почему сетки больше определенного размера не отображаются должным образом? Есть ли произвольный верхний предел, о котором я не знаю?


person moosefetcher    schedule 23.11.2012    source источник


Ответы (3)


Я не знаю Stage3D, и я говорю здесь на языке OpenGL, но обычный способ рисования фона / скайбокса - это нарисовать фон крупным планом, а не далеко, сначала нарисовать фон и либо отключить запись буфера глубины, пока фон отрисовывается (если он не требует самой буферизации глубины) или очистить буфер глубины после того, как фон будет отрисован, но до того, как будет нарисована обычная сцена.

Ваше мерцание планет может быть связано с недостаточным разрешением буфера глубины; если это так, вы должны выбрать между

  1. приближая объекты к камере,
  2. перемещение усеченной плоскости камеры ближней плоскости дальше или дальней плоскости ближе (это увеличит разрешение буфера глубины по всей сцене), или
  3. рендеринг сцены несколько раз во взаимоисключающих диапазонах глубин (это называется очисткой глубины).
person Kevin Reid    schedule 23.11.2012
comment
Спасибо за этот совет. Когда я увеличиваю расстояние до плоскости пирамиды, это немного уменьшает проблему. Я не думал о разрешении буфера глубины - я мог бы попытаться уменьшить количество полигонов на сетке быстрее, когда она отступает, и посмотреть, исправит ли это это полностью. - person moosefetcher; 26.11.2012
comment
Я просто хочу добавить, что этот совет был действительно полезным. Теперь я рисую различные объекты в нескольких отдельных циклах - те, которые ВСЕГДА будут первыми за другими более близкими объектами, без добавления их в буфер z, а объекты с прозрачностью - последними. Работает и отлично смотрится! Спасибо еще раз. - person moosefetcher; 13.02.2013

Вам следует использовать скворца. Это может работать

http://www.adobe.com/devnet/flashplayer/articles/away3d-starling-interoperation.html http://www.flare3d.com/blog/2012/07/24/flare3d-2-5-starling-integration/

person val    schedule 27.11.2012
comment
Назовите меня обжорой наказания, но когда я начал этот 3D-проект, мне действительно было интересно выяснить, как все работает «под капотом». Теперь это скорее мрачная решимость. - person moosefetcher; 13.02.2013

Вы должны посмотреть, как выполняется проекция и вывод вершинного шейдера. Выходные данные вершинного шейдера состоят из четырех компонентов: x, y, z, w. Отсюда вычисляются пиксельные координаты:

x' = x/w

y' = y/w

z' = z/w

z '- это то, что попадает в буфер z. Таким образом, просто поместив z = w * value в конец вершинного шейдера, вы можете вывести любое постоянное значение. Просто введите значение = .999 и готово! Ваш обычный тест с меньшей глубиной будет работать.

person starmole    schedule 29.11.2012