0

我在 C# 中使用 XNA 绘制图形

View = Matrix.CreateLookAt(new Vector3(0f, 100f, 0f), Vector3.Zero, Vector3.Forward);

Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(20.0f), ((Game1)Game).graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 10000.0f);

我的相机从不移动,只有我的游戏对象移动。我以下列方式移动它们以获得平滑的运动

float speed = 0.001f;
pos.Z = pos.Z + (gameTime.ElapsedGameTime.Milliseconds * speed);

但是,我有道路瓷砖(Primitives VertexPositionTexture)要在另一个之后渲染,以给人一种道路行驶的感觉。

它有效,但有时它是我不想要的道路瓷砖之间的像素间距。我认为这与浮点坐标有关。

我应该如何解决这个问题?

提前致谢!我希望我的解释清楚我的问题。

编辑1:如果有人想对这篇文章投反对票,请评论原因。没有反馈就很难开发。

编辑 2:关于原语的信息。

杆 1 上的 res 400 x 50

在此处输入图像描述

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    class Rod
    {
        public static Microsoft.Xna.Framework.Graphics.VertexBuffer buffer;
        public static Texture2D[] tex;
        public static BasicEffect effect;

        public Vector3 pos;
        public int typ;

        public const float Width = 24f;
        public const float Height = 5;

        public Rod(Vector3 pos,Random r)
        {
            this.pos = pos;
            typ = r.Next(tex.Length);
        }

        static public void Initialize(GraphicsDevice g)
        {
            buffer = new VertexBuffer(g, VertexPositionTexture.VertexDeclaration, 6, BufferUsage.WriteOnly);

            VertexPositionTexture[] vertices = new VertexPositionTexture[6];

            vertices[0].Position = new Vector3(-Width, 0f, -Height);
            vertices[0].TextureCoordinate.X = 0;
            vertices[0].TextureCoordinate.Y = 0;

            vertices[1].Position = new Vector3(Width, 0f, Height);
            vertices[1].TextureCoordinate.X = 1;
            vertices[1].TextureCoordinate.Y = 1;

            vertices[2].Position = new Vector3(-Width, 0f, Height);
            vertices[2].TextureCoordinate.X = 0;
            vertices[2].TextureCoordinate.Y = 1;



            vertices[3].Position = new Vector3(Width, 0f, Height);
            vertices[3].TextureCoordinate.X = 1;
            vertices[3].TextureCoordinate.Y = 1;

            vertices[4].Position = new Vector3(-Width, 0f, -Height);
            vertices[4].TextureCoordinate.X = 0;
            vertices[4].TextureCoordinate.Y = 0;

            vertices[5].Position = new Vector3(Width, 0f, -Height);
            vertices[5].TextureCoordinate.X = 1;
            vertices[5].TextureCoordinate.Y = 0;

            buffer.SetData<VertexPositionTexture>(vertices);
            effect = new BasicEffect(g);
            effect.TextureEnabled = true;
        }

        public void SetTyp(Random r)
        {
            typ = r.Next(tex.Length);
        }

        public void Update(GameTime gameTime, Double speed)
        {
           // pos = new Vector3(pos.X, pos.Y, pos.Z + (gameTime.ElapsedGameTime.Milliseconds * speed) );
            pos.Z = pos.Z + (float)(gameTime.ElapsedGameTime.Milliseconds * speed);
        }

        public void Draw(Matrix View, Matrix Projection, GraphicsDevice g)
        {
            effect.World = Matrix.CreateScale(1.01f) * Matrix.CreateTranslation(pos);
            effect.View = View;
            effect.Projection = Projection;
            effect.Texture = tex[typ];

            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                g.SetVertexBuffer(buffer);
                pass.Apply();
                g.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
            }
        }
    }
}
4

2 回答 2

4

如果没有更多详细信息,我无法确定问题所在,但可能会发生以下情况:

例如,假设您正在绘制两个矩形。因此,如果您独立绘制它们中的每一个,您将得到如下结果:

+--------+
|        |
|        |
+--------+  < gap greatly exaggerated
+--------+  <
|        |
|        |
+--------+

这可能会导致明显的间隙。

你想要的是这样的:

+--------+
|        |
|        |
+--------+
|        |
|        |
+--------+

不是在没有间隙的意义上,而是在共享顶点的意义上。

在上图中,有 8 个顶点。在底部,有 6 个,因为顶点在矩形之间共享。这意味着即使在理论上也不可能有差距,因为两者之间只有一条边。

您需要做的是重构代码以在矩形之间共享顶点。

在图形编程中,这通常被称为四边形或三角形带。Riemer 有一个页面在 XNA 的上下文中解释三角形条带。

于 2013-02-12T15:09:14.910 回答
0

您可以尝试使用 Matrix.CreateScale(1.01f) 转换纹理

此外,在您的绘画程序中最初创建纹理时,您的纹理是否被正确缩放或调整大小?在任何情况下,通过浮动缩放纹理都会导致边缘不准确,应尽可能避免。

于 2013-02-12T15:04:35.940 回答