当前位置: 首页 > 编程语言 > C#

XNA – 以正确的顺序绘制四边形(和基元)分享

时间:2023-04-10 22:45:32 C#

C#学习教程:XNA-以正确的顺序绘制四边形(和基元)(甚至不知道问题是什么)。简而言之:我在游戏中使用以下方法绘制四边形:effect.World=Matrix.Identity*Matrix.CreateRotationX(Rotation.X)*Matrix.CreateRotationY(Rotation.Y)*Matrix.CreateRotationZ(Rotation.Z)*Matrix.CreateTranslation(位置);//应用相机矩阵effect.View=viewMatrix;effect.Projection=projectionMatrix;graphics.VertexDeclaration=vertDec;//开始绘制效果effect.Begin();foreach(EffectPasspassineffect.CurrentTechnique.Passes){pass.Begin();graphics.DrawUserIndexedPrimitives(PrimitiveType.TriangleList,quad.Vertices,0,4,quad.Indexes,0,2);通过.End();}effect.End();我的效果也有这些属性:this.effect.TextureEnabled=true;this.effect.Texture=纹理;有用。我的四边形画得很好,我很高兴。但是有一个小问题。如果一个四边形位于另一个四边形或常规模型的后面,则确定哪个四边形绘制在顶部的方法是我绘制它们的顺序。假设我在四边形B之前绘制四边形A,那么B将出现在四边形A的顶部,即使它在Z轴上小于40个单位。我必须说,它看起来很乱!;)现在我的常规网格没有任何这样的问题,当涉及基元时,事情会变得一团糟。绘制常规线条的相同问题:graphics.DrawUserIndexedPrimitives(PrimitiveType.LineStrip,pointList,0,//要添加到索引缓冲区6的每个元素的顶点缓冲区偏移量,//pointList中的顶点数newshort[]{0,1},//索引缓冲区0,//要读取的第一个索引元素1//要绘制的图元数量所以我真正要问的是:A)这正常吗?我是否应该构建一个特殊的引擎来决定何时绘制什么?我可以在我的项目中通过在正确的时间绘制东西来轻松解决这个问题,但我可以想象一个我无法想象的游戏。比如fps不能到处画广告牌!;)B)如果这不起作用,可能是什么原因以及调试错误的解决方案/好方法。我很感激任何帮助来解决这个问题!?听起来您关闭了深度缓冲区。也许你手头正在画精灵?(使用SpriteBatch会改变正常3D绘图所需的各种渲染状态。)尝试在绘制任何3D对象之前添加这行代码:GraphicsDevice.RenderState.DepthBufferEnable=true;相关链接:关于深度缓冲区(或“Z-buffer”),可以查看维基百科文章。深度缓冲区的简要说明:它基本上是场景的位图图像,存储每个像素“去到多深”(深度)“进入屏幕。当你去绘制你的第二个对象时,它会首先计算它要绘制的每个像素的“深度”-以及已经有一个对象“前面”的区域的深度缓冲区(深度更近的像素值)区域,它将简单地跳过这些像素的绘制。(您的常规网格没有问题的原因可能是由于背面剔除,并且您的网格没有按前后顺序绘制的任何“重叠位”.)至于调试此类错误的好方法(奇怪的深度缓冲区问题、错误的渲染状态以及渲染输出不是您期望的大多数其他情况),我强烈建议安装DirectXSDK并学习使用PIX.感谢您回答这个问题!只是跟进任何想知道这个答案的人。在xna4.0中它发生了一些变化。一些3D瓦片对象对其他3D对象是透明的。这是由于删除了:GraphicsDevice.RenderState.DepthBufferEnable=true;在XNA4中,它被替换为:DepthStencilStatedepthBufferState=newDepthStencilState();depthBufferState.DepthBufferEnable=true;GraphicsDevice.DepthStencilState=depthBufferState;取自此来源:http:https://www.hexworld.co.uk/blog/?cat=9以上就是C#学习教程的全部内容:XNA-以正确的顺序绘制四边形(和图元)。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: