C# 如何使基本体在DirectX(2D)中正确覆盖精灵

C# 如何使基本体在DirectX(2D)中正确覆盖精灵,c#,graphics,directx,slimdx,C#,Graphics,Directx,Slimdx,我在Direct3D9中渲染精灵和基本体时遇到问题。我正在尝试使用精灵制作一个简单的2D游戏,但是我发现我还需要原语来绘制简单的正方形、线等。问题在于叠加 如果我只使用Device.DrawUserPrimitives()绘制基本体,一切正常,基本体渲染正确。如果我只使用Sprite.draw()绘制精灵,也可以。但是,如果我想同时绘制精灵和基本体,所有精灵都会自动覆盖基本体或使其变为黑色 我试过禁用Z缓冲区,在渲染精灵时禁用在Z缓冲区中写入,等等,但都是一样的。我试图通过改变精灵的z位置使其覆

我在Direct3D9中渲染精灵和基本体时遇到问题。我正在尝试使用精灵制作一个简单的2D游戏,但是我发现我还需要原语来绘制简单的正方形、线等。问题在于叠加

如果我只使用
Device.DrawUserPrimitives()
绘制基本体,一切正常,基本体渲染正确。如果我只使用
Sprite.draw()
绘制精灵,也可以。但是,如果我想同时绘制精灵和基本体,所有精灵都会自动覆盖基本体或使其变为黑色

我试过禁用Z缓冲区,在渲染精灵时禁用在Z缓冲区中写入,等等,但都是一样的。我试图通过改变精灵的z位置使其覆盖精灵,但所有的精灵都是黑色的…:(

请注意,我在绘制精灵之前和之后都尝试过渲染原语,但没有任何帮助

我将在这里发布一些绘图精灵和原语的片段(变量名称已更改,因此即使您对C#和SlimDX一无所知,您也可以理解我所绘制的内容):

…其中m_fan1是一个包含
Vector4位置
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.End()(http://msdn.microsoft.com/en-us/library/ms881042.aspx),Sprite.End()“将设备恢复到调用Sprite.Begin之前的状态。”

    在绘制用户基本体之后,我还将执行device.EndScene()


    希望能有所帮助!

    我使用
    sprite.Transform();

    相比

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

    我希望这能帮助其他遇到此问题的人。

    如果看不到完整的代码,就不可能找到错误。我会检查精灵和原语的z缓冲区值。如果这部分是正确的,那么原语就没有理由不过度使用backbuffer。 是否设置每个渲染周期基本体所需的渲染状态?默认情况下,d3dx精灵会设置自己的渲染状态,这可能会弄乱基本体。 并且,在绘制精灵时,有一个标志D3DXSPRITE\u DONOTMODIFY\u RENDERSTATE


    ->当您更改z值时,您的基本体变暗时,我认为这是由您的光源(范围?

    感谢您的尝试,但是Sprite.End()和Device.EndScene()已经在我的源代码中,否则它将无法工作。:)我尝试了许多方法,但仍然无法工作。。。也许这和我的顶点缓冲区有关,但我真的不知道(哦,我明白了。我使用ILSpy查找Sprite的实际代码,发现它所做的只是调用非托管ID3DXSprite中的方法。也许ID3DXSprite设置的状态列表会有所帮助?我发现,如果我不使用DoNotModifyRenderState标志,则原语会正确渲染。但是,Sprite不会。因此就有了设备渲染状态可能有问题。有什么想法吗?抱歉,我无法验证您对我3年前的问题的答案。:)谢谢。
    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