У меня проблема с рендерингом спрайтов и примитивов в 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);
Кстати:
- Если я изменяю режим заполнения на каркас, каркасы примитивов отображаются правильно.
- Если примитивы перекрывают спрайты, примитивы почти черного цвета, и чем больше я рисую спрайтов, тем темнее примитивы. Может быть, это как-то связано с альфой?
- Все примитивы отображаются правильно , пока я не нарисую спрайт. Но дажеесли я перестану рисовать спрайты, примитивы останутся темными / черными, пока я не перезапущу приложение.
Если вам нужны другие фрагменты моего исходного кода, просто напишите здесь, пожалуйста, и я обновлюэто.