2010-12-15 2 views
0

Это меня расстраивает, так как я уже сел на него через пару часов.Рисунок 3D спереди/сзади спрайты в XNA/WP7?

В основном я рисую 2D спрайты через spritebatch и 3D-орфографически проецируемую геометрию с использованием класса BasicEffect.

Моя проблема заключается в том, чтобы контролировать то, что получается в верхней части чего. Сначала я думал, что это будет просто контролировать порядок рендеринга, то есть, если я:

Draw3DStuff() 

SpriteBatch.Begin(...) 
Draw2DStuff(); 
SpriteBatch.End(); 

Это будет означать, что 2D материал будет оказывать над 3D материал, однако, так как я не контролировать, когда начинается устройство/заканчивается, это не результат. 3D всегда отображает поверх 2D-элементов независимо от параметров проекции, переноса мира, z-компонентов определений вершин 3D-геометрии и глубины слоя 2D-элементов.

Есть ли что-то, что я здесь не ищу? Каков правильный способ обработки глубины?

+0

Возможно, вы нанесли удар по gamedev.stackexchange.com. – Nate 2010-12-15 16:30:38

ответ

4

OK Я понял это через 2 секунды после размещения этого вопроса. Я не знаю, было ли это совпадением или StackOverflow имеет новую функцию, предоставляющую возможность видеть будущие ответы.

Позиция Z элементов spritebatch находится между 0 и 1, поэтому они не могут быть непосредственно сопоставимы с позициями z, выполняемыми рендерингом орфографической геометрии.

При создании орфографической матрицы, однако, вы определяете плоскость ближнего и дальнего клипа. Установленный вами Z должен находиться внутри этой плоскости клипа. У меня была догадка, что класс spritebatch эффективно рисует квадрациклы орфографически, поэтому по расширению, которое от 0 до 1 будет означать, что 0 представляет собой близкий клип и 1 дальний клип, а глубина, вероятно, отображается в том же месте, что и глубина 3D-геометрии к которому относится.

Soooo, чтобы заставить его работать, я просто подумал, что ближние/дальние клипы, которые я определял для орфографической визуализации, будут измеряться относительно ближних/дальних клипов обрабатываемых спрайтов, так что это просто вопрос настройки right z value, так например:

Если у меня есть близкий клип 0 и дальний клип размером 10000, и я хотел бы нарисовать его так, чтобы он соответствовал глубине слоя 0.5f и визуализации перед рисованием спрайтов на 0,6 и за спрайтов втягиваются в 0,4 я:

float zpos = 0.5f; 
    float orthoGraphicZPos = LinearInterpolate(0, 10000, zpos); 

Или просто zpos * 10000: D

Я думаю, было бы разумнее, если бы ваши орфографические визуализаторы ближнего/дальнего клипа были равны 0 и 1 для прямого сравнения с глубинами слоя спрайтов.

Надеюсь, мои аргументы в пользу этого решения были правильными (более или менее).

2

В стороне, поскольку вы упомянули, что у вас возникла догадка о том, как партия спрайтов рисовала квадроциклы. Вы можете увидеть исходный код для всех/включены шейдеров по умолчанию и класс SpriteBatch, если вам интересно, или нужна помощь в решении проблемы, как это:
http://create.msdn.com/en-US/education/catalog/sample/stock_effects

1

Проблема заключается в том, что SpriteBatch мур с некоторыми из renderstates которые используются при рисовании трехмерных объектов. Чтобы исправить это, вам просто нужно сбросить их, прежде чем создавать 3D-объекты.

GraphicsDevice.BlendState = BlendState.Opaque; 
GraphicsDevice.DepthStencilState = DepthStencilState.Default; 
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; 

Draw3DStuff() 

SpriteBatch.Begin(...) 
Draw2DStuff(); 
SpriteBatch.End(); 

Обратите внимание, что это для xna 4.0, и я уверен, что вы все равно используете его. Более подробную информацию можно найти на странице shawn hargreaves blog here. Это приведет к сбросу состояний визуализации, нарисует 3D-объекты, а затем объекты 2d над ними. Без сброса состояний рендеринга вы получаете такие странные эффекты, как ваше видение.

Смежные вопросы