我在使用Direct3D9渲染精灵和基本图形时遇到了问题。我想要制作一个简单的2D游戏,使用精灵绘制,然而我发现还需要使用基本图形来绘制简单的矩形,线条等等。问题出在重叠上。
如果我只使用
我尝试禁用Z缓冲区,在绘制精灵时禁用写入Z缓冲区等等,但结果都一样。我设法通过更改基本图形的z位置,让基本图形覆盖精灵,但是这样做会使所有的基本图形都变成黑色... :(
请注意,我已经尝试过先绘制基本图形和后绘制精灵,但并没有帮助。
下面是一些绘制精灵和基本图形的代码片段(变量名已更改,以便理解即使您不了解C#和SlimDX):
顺便提一下:
如果我只使用
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位置
和int颜色
的结构体,而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 有关?
- 所有图元都会正确地呈现,直到我绘制精灵为止。但即使我停止绘制精灵,图元仍然保持暗/黑色,直到我重置应用程序为止。