gpt4 book ai didi

xna - 奇怪的 "fuzz"在 XNA 4.0 中在平面上渲染纹理时

转载 作者:行者123 更新时间:2023-12-04 17:39:56 24 4
gpt4 key购买 nike

我刚刚开始使用 XNA,我确信我错过了一些非常简单的东西。我有一个为地面绘制的四边形平面。在这个平面上,我包裹了一个 2D 纹理。纹理在近处看起来不错,但是当我四处移动相机时,我看到到处都是一堆白色的伪影。当我靠近它们时它们消失了。我猜这是一个采样问题或类似的问题,但我被卡住了。

首先,我创建了一个 QuadDrawer 类来为我绘制平面。它派生自 DrawableGameComponent。

四抽屉:

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);
}

}

从我的主 Game 类的 Initialize() 方法中,我简单地实例化这个对象并传入我想要使用的 GameObject、Size 和 Texture 名称:
_floor = new QuadDrawer(this, 100.0f, "Textures/checker");
this.Components.Add(_floor);

一旦对象被添加到我的组件集合中,我的 QuadDrawer 的 Draw 方法就会被调用,一切都应该很好。这是我所看到的图像。请注意,这应该是纯灰色,浅色线条以网格图案运行。当您在表面上移动相机时,白色伪影似乎会移动,但当您靠近时就会消失。

这是显示白色伪影的图片:

Fuzzy

这是一个特写,显示了它的外观:
Close Up

这是另一张图片,显示从远处看它会变得多么糟糕:
Better view of the problem

从远处看它应该是这样的:
enter image description here

图片不是最好的,但你可以看到我在说什么。当相机移动时,它变得非常糟糕。我在其他地方看到过这种纹理,效果很好。知道它可能是什么吗?

如果您需要,我很乐意提供更多信息。

谢谢,

-斯科特

最佳答案

首先你需要为您的纹理启用 mipmap .如果它只是一个独立的 Assets ,您可以在解决方案资源管理器中选择它,按 F4 进入属性,展开“内容处理器”节点并将“生成 Mipmaps”设置为 true。

This article by Shawn Hargreaves explains why .看看那篇文章中这两张图片的区别:

http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-70-20-metablogapi/2388.image_5F00_401AFB8B.png

http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-70-20-metablogapi/6518.image_5F00_1B896E07.png

(看起来很像您的示例图像,不是吗?)

然后,如果您要以这样的倾斜角度观看,您需要启用各向异性过滤 (Layoric 在他的回答中解释了如何)。此图片来自 wikipedia说明了各向异性过滤的用途 - 请注意它如何水平“取消模糊”背景(由 mipmap 引起)。


(来源:wikimedia.org)

关于xna - 奇怪的 "fuzz"在 XNA 4.0 中在平面上渲染纹理时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com