【发布时间】:2011-07-01 16:43:22
【问题描述】:
我在 Direct3D9 中渲染精灵和图元时遇到了问题。我正在尝试使用精灵制作一个简单的 2D 游戏,但是我发现我还需要原语来绘制简单的正方形、线条等。问题在于叠加。
如果我只使用Device.DrawUserPrimitives() 绘制图元,一切都很好,图元被正确渲染。如果我只使用Sprite.Draw() 绘制精灵,也可以。但是,如果我想同时绘制精灵和图元,所有精灵都会自动覆盖图元或使其变黑。
我尝试过禁用 Z 缓冲区,在渲染精灵时禁用 Z 缓冲区中的写入,等等,但它总是一样的。我设法通过改变它们的 z 位置使图元覆盖精灵,但是所有图元都是黑色的...... :(
请注意,我在绘制精灵之前和之后都尝试过渲染图元。它没有帮助。
我将在此处发布一些绘图精灵和图元的 sn-ps(变量名称已更改,因此即使您对 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 有关?
- 所有图元都正确渲染直到我绘制一个精灵。但即使我停止绘制精灵,在我重置应用程序之前,图元也会保持暗/黑色。
如果你需要我源代码的其他sn-ps,请写在这里,我会更新这个。
【问题讨论】:
标签: c# graphics directx slimdx