Я создаю трехмерную космическую игру в Stage3D и хочу, чтобы за ВСЕМИ другими объектами было нарисовано звездное поле. Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, что расстояния очень велики. Если у меня действительно есть звезды намного дальше, чем другие объекты, я должен масштабировать их до такой степени, чтобы они не отображались правильно - выше определенного размера лица кажутся мерцающими. То же самое происходит и с сетками моей планеты, если масштабировать их до необходимых размеров (12000-100000 единиц в поперечнике). Я визуализирую звезды на плоских текстурах, обращенных лицом к камере. Пока они не слишком увеличены в масштабе, они отображаются хорошо, хотя явно перед другими объектами, находящимися дальше. Я пробовал всевозможные режимы depthTestModes (Context3DCompareMode.LESS, Context3DCompareMode.GREATER и все другие) в сочетании с включением и исключением сетки в z-буфере, чтобы звезды отображались только в том случае, если НЕТ других пикселей там, где звезда могла бы появляются, без везения. Кто-нибудь знает, как я могу этого добиться - или, что еще лучше, знает, почему сетки больше определенного размера не отображаются должным образом? Есть ли произвольный верхний предел, о котором я не знаю?
Может ли Stage3D рисовать объекты позади всех остальных независимо от фактического расстояния?
Ответы (3)
Я не знаю Stage3D, и я говорю здесь на языке OpenGL, но обычный способ рисования фона / скайбокса - это нарисовать фон крупным планом, а не далеко, сначала нарисовать фон и либо отключить запись буфера глубины, пока фон отрисовывается (если он не требует самой буферизации глубины) или очистить буфер глубины после того, как фон будет отрисован, но до того, как будет нарисована обычная сцена.
Ваше мерцание планет может быть связано с недостаточным разрешением буфера глубины; если это так, вы должны выбрать между
- приближая объекты к камере,
- перемещение усеченной плоскости камеры ближней плоскости дальше или дальней плоскости ближе (это увеличит разрешение буфера глубины по всей сцене), или
- рендеринг сцены несколько раз во взаимоисключающих диапазонах глубин (это называется очисткой глубины).
Вам следует использовать скворца. Это может работать
http://www.adobe.com/devnet/flashplayer/articles/away3d-starling-interoperation.html http://www.flare3d.com/blog/2012/07/24/flare3d-2-5-starling-integration/
Вы должны посмотреть, как выполняется проекция и вывод вершинного шейдера. Выходные данные вершинного шейдера состоят из четырех компонентов: x, y, z, w. Отсюда вычисляются пиксельные координаты:
x' = x/w
y' = y/w
z' = z/w
z '- это то, что попадает в буфер z. Таким образом, просто поместив z = w * value в конец вершинного шейдера, вы можете вывести любое постоянное значение. Просто введите значение = .999 и готово! Ваш обычный тест с меньшей глубиной будет работать.