这让我感到很沮丧,因为我现在已经在这里哭了几个小时了。
基本上我是使用BasicEffect类通过spritebatch和3D正交投影几何绘制2D精灵。
我的问题是控制在什么之上呈现的内容。起初我以为它只是控制渲染顺序,即如果我这样做:
Draw3DStuff()
SpriteBatch.Begin(...)
Draw2DStuff();
SpriteBatch.End();
这意味着2D内容会渲染3D内容,但是由于我无法控制设备何时开始/结束渲染,这不是结果。无论投影设置,世界平移,3D几何顶点定义的z分量和2D元素的图层深度,3D总是呈现在2D元素之上。
有什么我不在这里看的吗? 在这里处理深度的正确方法是什么?
答案 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对象。在不重置渲染状态的情况下,您会看到奇怪的效果。