我在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);
顺便说说:
如果将填充模式更改为线框,则将正确绘制图元的线框。
如果图元覆盖精灵,则图元几乎是黑色的,而我绘制的精灵越多,图元就越暗。也许与alpha有关?
正确绘制所有图元,直到绘制精灵为止。但是,即使我停止绘制精灵,在重置应用程序之前,图元仍将保持黑色/黑色。
如果您还需要我的源代码的其他摘要,请在此处编写,我将对其进行更新。
最佳答案
我用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
希望这对遇到此问题的其他人有所帮助。
关于c# - 如何使图元正确覆盖DirectX(2D)中的 Sprite ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6550792/