在XNA / WP7中在前/后精灵中绘制3D?

时间:2010-12-15 16:24:47

标签: windows-phone-7 3d xna 2d

这让我感到很沮丧,因为我现在已经在这里哭了几个小时了。

基本上我是使用BasicEffect类通过spritebatch和3D正交投影几何绘制2D精灵。

我的问题是控制在什么之上呈现的内容。起初我以为它只是控制渲染顺序,即如果我这样做:

Draw3DStuff()

SpriteBatch.Begin(...)
Draw2DStuff();
SpriteBatch.End();

这意味着2D内容会渲染3D内容,但是由于我无法控制设备何时开始/结束渲染,这不是结果。无论投影设置,世界平移,3D几何顶点定义的z分量和2D元素的图层深度,3D总是呈现在2D元素之上。

有什么我不在这里看的吗? 在这里处理深度的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

好的,我在发布这个问题后2秒就知道了。我不知道这是巧合还是StackOverflow有一个新功能,能够看到未来的答案。

spritebatch元素的Z位置介于0和1之间,因此它们与正在渲染的正交几何体的z位置无法直接比较。

创建正交矩阵时,您可以定义近和远剪裁平面。您设置的Z pos应位于此剪裁平面内。我有一种预感,spritebatch类正在有效地绘制四边形,因此通过扩展0到1表示0表示近剪辑,1表示远剪辑,深度可能被渲染到相同的位置,3D几何深度是被渲染到。

Soooo,为了使它工作我只是想到我正在为正交渲染定义的近/远剪辑将被测量到正在渲染的精灵的近/远剪辑,所以这只是设置正确的问题z值,例如:

如果我的近剪辑为0且远剪辑为10000,我想绘制它以使其对应于0.5f图层深度并在精灵前面渲染为0.6并且后面的精灵被绘制为0.4我这样做:

   float zpos = 0.5f;
   float orthoGraphicZPos = LinearInterpolate(0, 10000, zpos);

或者只是zpos * 10000:D

我想让你的正交渲染器靠近/远处剪辑为0和1会更有意义,直接与精灵图层深度进行比较。

希望我对此解决方案的推理是正确的(或多或少)。

答案 1 :(得分:2)

顺便说一句,既然你提到你对精灵批处理四边形的方式有所预感。如果您感到好奇,可以查看所有默认/包含的着色器和spritebatch类的源代码,或者需要帮助解决这样的问题:
http://create.msdn.com/en-US/education/catalog/sample/stock_effects

答案 2 :(得分:1)

问题在于spritebatch会混淆一些绘制3d对象时使用的渲染器。要解决此问题,您只需在渲染3d对象之前重置它们。

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; 

Draw3DStuff()

SpriteBatch.Begin(...)
Draw2DStuff();
SpriteBatch.End();

请注意,这是针对xna 4.0的,我非常肯定你还在使用它。更多信息可以在shawn hargreaves blog here找到。这将绘制重置渲染状态,绘制3d对象,然后绘制2d对象。在不重置渲染状态的情况下,您会看到奇怪的效果。