我在 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);
顺便一提:
- 如果我将填充模式更改为线框,则可以正确绘制图元的线框。
- 如果图元覆盖精灵,图元几乎是黑色的,我绘制的精灵越多,图元越暗。也许它与阿尔法有关?
- 在我绘制 sprite 之前,所有图元都被正确渲染。但即使我停止绘制精灵,在我重置应用程序之前,图元将保持暗/黑色。
如果您需要我的源代码的其他片段,请写在这里,我会更新它。