Я только начинаю работать с XNA и уверен, что упускаю что-то очень простое. У меня есть четырехместный самолет, который я нарисовал для земли. На этой плоскости я обернул 2D текстуру. Текстура выглядит хорошо вблизи, но когда я перемещаю камеру, я вижу повсюду кучу белых артефактов. Они исчезают, когда я приближаюсь к ним. Я предполагаю, что это проблема выборки или что-то подобное, но я застрял.
Сначала я создал класс QuadDrawer, чтобы нарисовать для меня плоскость. Он получен из DrawableGameComponent.
QuadDrawer:
class QuadDrawer : DrawableGameComponent
{
private string _textureName;
private Texture2D _texture;
private BasicEffect _effect;
private float _size = 100;
private VertexPositionNormalTexture[] _vertices;
private int[] _indices;
public QuadDrawer(Game game, float size, string textureName)
: base(game)
{
this._size = size;
this._textureName = textureName;
}
public override void Initialize()
{
BuildVertices();
base.Initialize();
}
private void BuildVertices()
{
_vertices = new VertexPositionNormalTexture[4];
_indices = new int[6];
_vertices[0].Position = Vector3.Forward + Vector3.Left;
_vertices[0].TextureCoordinate = new Vector2(0.0f, 1.0f);
_vertices[1].Position = Vector3.Backward + Vector3.Left;
_vertices[1].TextureCoordinate = new Vector2(0.0f, 0.0f);
_vertices[2].Position = Vector3.Forward + Vector3.Right;
_vertices[2].TextureCoordinate = new Vector2(1.0f, 1.0f);
_vertices[3].Position = Vector3.Backward + Vector3.Right;
_vertices[3].TextureCoordinate = new Vector2(1.0f, 0.0f);
for (int i = 0; i < _vertices.Length; i++)
{
_vertices[i].Normal = Vector3.Up;
_vertices[i].Position *= _size;
_vertices[i].TextureCoordinate *= _size;
}
_indices[5] = 0; _indices[4] = 1; _indices[3] = 2;
_indices[2] = 2; _indices[1] = 1; _indices[0] = 3;
}
protected override void LoadContent()
{
_texture = this.Game.Content.Load<Texture2D>(_textureName);
_effect = new BasicEffect(this.GraphicsDevice);
_effect.EnableDefaultLighting();
_effect.PreferPerPixelLighting = true;
_effect.SpecularColor = new Vector3(0.1f, 0.1f, 0.1f);
_effect.World = Matrix.Identity;
_effect.TextureEnabled = true;
_effect.Texture = _texture;
base.LoadContent();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
public override void Draw(GameTime gameTime)
{
MyGame game = this.Game as MyGame;
GraphicsDevice.SamplerStates[0] = SamplerState.AnisotropicWrap;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
_effect.View = game.Camera.ViewMatrix;
_effect.Projection = game.Camera.ProjectionMatrix;
foreach (EffectPass pass in _effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionNormalTexture>(PrimitiveType.TriangleList, _vertices, 0, 4, _indices, 0, 2);
}
base.Draw(gameTime);
}
}
Из метода Initialize () моего основного класса Game я просто создаю экземпляр этого объекта и передаю GameObject, Size и имя текстуры, которую я хочу использовать:
_floor = new QuadDrawer(this, 100.0f, "Textures/checker");
this.Components.Add(_floor);
Как только объект добавлен в мою коллекцию компонентов, вызывается метод Draw моего QuadDrawer, и все должно быть хорошо. Вот изображение того, что я вижу. Обратите внимание, что это должен быть сплошной серый с светлыми цветными линиями, идущими в виде сетки. Белые артефакты кажутся движущимися при перемещении камеры по поверхности, но исчезают, когда вы приближаетесь.
Вот изображение, показывающее белые артефакты:
Это крупный план, показывающий, как это должно выглядеть:
Вот еще одна картинка, показывающая, как плохо это может быть на расстоянии:
А вот как это должно выглядеть на расстоянии:
Картинка не самая лучшая, но вы можете видеть, о чем я говорю. Когда камера движется, становится очень плохо. Я видел эту текстуру, используемую в других местах, и она отлично работает. Есть идеи, что бы это могло быть?
Я был бы рад предоставить больше информации, если вам это нужно.
Спасибо
-Скотт