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