我在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 positionint 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/

10-10 14:00