Как правильно создать примитивы для наложения спрайтов в DirectX (2D) - PullRequest
3 голосов
/ 01 июля 2011

У меня проблема с рендерингом спрайтов и примитивов в Direct3D9.Я пытаюсь сделать простую 2D-игру, используя спрайты, однако я обнаружил, что мне также понадобятся примитивы для рисования простых квадратов, линий и т. Д. Проблема с наложением.

Если я толькорисовать примитивы используя Device.DrawUserPrimitives(), все хорошо, примитивы отображаются правильно.Если я рисую только спрайты, используя Sprite.Draw(), это тоже нормально.Однако, если я хочу нарисовать как спрайты, так и примитивы, все спрайты автоматически перекрывают примитивы или делают их черными.

Я пытался отключить буфер Z, отключить запись в буфер Z при рендеринге спрайтов и т. Д., Но это всегда былотак же.Мне удалось заставить примитивы перекрывать спрайты, изменив их положение z , но тогда все примитивы стали черными ...: (

Обратите внимание, что я пытался рендерить примитивы как до, так ипосле рисования спрайтов. Это не помогло.

Я опубликую здесь некоторые фрагменты рисования спрайтов и примитивов (имена переменных изменены, чтобы вы понимали, что я рисую, даже если вы ничего не знаете о C #и SlimDX):

mSprite.Begin(SpriteFlags.ObjectSpace | SpriteFlags.DoNotModifyRenderState);
mSprite.Draw(texture, centerVector, positionVector, color); // positionVector = Vector3.Zero in my example
mSprite.Flush();

(...)

device.VertexDeclaration = vertexDecl;
device.DrawUserPrimitives(PrimitiveType.TriangleFan, m_fan1.Length - 2, m_fan1);

... где m_fan1 - это структура, содержащая Vector4 position и int color и vertexDecl , объявляющая эти элементы вершины.

m_fan1[0] = new TransformedColored(new Vector4(100.0f, 100.0f, 1.0f, 1.0f), Color.Green);
m_fan1[1] = new TransformedColored(new Vector4(0.0f, 0.0f, 1.0f, 1.0f), Color.Green);
m_fan1[2] = new TransformedColored(new Vector4(200.0f, 0.0f, 1.0f, 1.0f), Color.Green);
m_fan1[3] = new TransformedColored(new Vector4(200.0f, 200.0f, 1.0f, 1.0f), Color.Green);
m_fan1[4] = new TransformedColored(new Vector4(0.0f, 200.0f, 1.0f, 1.0f), Color.Yellow);
m_fan1[5] = new TransformedColored(new Vector4(0.0f, 0.0f, 1.0f, 1.0f), Color.Green);

Кстати:

  1. Если я изменяю режим заполнения на каркас, каркасы примитивов отображаются правильно.
  2. Если примитивы перекрывают спрайты, примитивы почти черного цвета, и чем больше я рисую спрайтов, тем темнее примитивы. Может быть, это как-то связано с альфой?
  3. Все примитивы отображаются правильно , пока я не нарисую спрайт. Но дажеесли я перестану рисовать спрайты, примитивы останутся темными / черными, пока я не перезапущу приложение.

Если вам нужны другие фрагменты моего исходного кода, просто напишите здесь, пожалуйста, и я обновлюэто.

Ответы [ 3 ]

1 голос
/ 21 августа 2012

Я решил это с помощью sprite.Transform();

sprite.Transform = Matrix.Scaling(1, 1, 1) * Matrix.Translation(x,y, 0); // works

по сравнению с

sprite.Transform = Matrix.Scaling(1, 1, 1) * Matrix.Translation(x,y, 1); // doesn't work

Надеюсь, это поможет любому, кто столкнулся с этой проблемой.

0 голосов
/ 30 сентября 2014

Не видя ваш полный код, найти ошибку невозможно. Я бы проверил значения z-буфера спрайта и наших примитивов. Если эта часть верна, нет никаких причин, по которым ваши примитивы не должны перебирать буфер. Вы устанавливаете состояния рендеринга, необходимые для примитивов в каждом цикле рендеринга? Спрайт d3dx по умолчанию устанавливает свои собственные состояния визуализации, возможно, это портит ваши примитивы. И при рисовании спрайта есть флаг D3DXSPRITE_DONOTMODIFY_RENDERSTATE.

-> Когда ваши примитивы темнеют при изменении значения z, я думаю, это вызвано вашими источниками света (диапазон?)

0 голосов
/ 01 июля 2011

Я не вижу вызываемого sprite.End ().Из документации здесь (http://msdn.microsoft.com/en-us/library/ms881042.aspx), Sprite.End () "Восстанавливает устройство в состояние, в котором оно находилось до вызова Sprite.Begin."

Я бы также сделал device.EndScene () после рисованияпользовательские примитивы.

Надеюсь, это поможет!

...