我正在使用从Microsoft网站下载的嵌入WinForms的XNA。我注意到当模型被绘制时,一切看起来都很好,但是一旦我旋转我的摄像机,模型边缘开始变得有锯齿。以下是两张相关的图片:
这在摄像机靠近目标物体时更加明显。我使用以下代码来绘制每个网格:
有时候当我旋转模型时,会出现奇怪的阴影。阴影甚至不会改变它们的“位置”,但是仍然以完全相同的方式绘制。
编辑: 我Google了一下,发现启用多重采样应该可以消除锯齿。那么,有人知道如何在WinForms中实现这一点吗? 编辑2: 关于后备缓冲区,我没有在任何地方设置它,所以我想它就像它应该的那样。这是GraphicsDeviceService.cpp构造函数:
![](https://istack.dev59.com/ayUOS.webp)
![](https://istack.dev59.com/9Tbs7.webp)
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.View = cam.view;
effect.Projection = cam.projection;
effect.World = mesh.ParentBone.Transform;
effect.EnableDefaultLighting();
}
mesh.Draw();
}
有时候当我旋转模型时,会出现奇怪的阴影。阴影甚至不会改变它们的“位置”,但是仍然以完全相同的方式绘制。
编辑: 我Google了一下,发现启用多重采样应该可以消除锯齿。那么,有人知道如何在WinForms中实现这一点吗? 编辑2: 关于后备缓冲区,我没有在任何地方设置它,所以我想它就像它应该的那样。这是GraphicsDeviceService.cpp构造函数:
GraphicsDeviceService(IntPtr windowHandle, int width, int height)
{
parameters = new PresentationParameters();
parameters.BackBufferWidth = Math.Max(width, 1);
parameters.BackBufferHeight = Math.Max(height, 1);
parameters.BackBufferFormat = SurfaceFormat.Color;
parameters.DepthStencilFormat = DepthFormat.Depth24;
parameters.DeviceWindowHandle = windowHandle;
parameters.PresentationInterval = PresentInterval.Immediate;
parameters.IsFullScreen = false;
graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
GraphicsProfile.Reach,
parameters);
}
此外,reset方法会相应地设置backBuffer。
编辑3:
我尝试将MultiSampleCount
设置为更大的数字,但没有帮助,现在有两张图片展示了发生的情况。首先,我在某个位置实例化对象,然后只向右移动相机。整个对象会被拉伸并出现锯齿状边缘,如下图所示。这是相机移动代码:
http://img152.imageshack.us/img152/5204/normalu.png
http://img28.imageshack.us/img28/4434/movedright.png
KeyboardState state = Keyboard.GetState();
Vector3 v;
if (state.IsKeyDown(Keys.Up) || state.IsKeyDown(Keys.W))
v = new Vector3(0, 0, 1) * moveSpeed;
else if (state.IsKeyDown(Keys.Down) || state.IsKeyDown(Keys.S))
v = new Vector3(0, 0, -1) * moveSpeed;
else if (state.IsKeyDown(Keys.Left) || state.IsKeyDown(Keys.A))
v = new Vector3(1, 0, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.Right) || state.IsKeyDown(Keys.D))
v = new Vector3(-1, 0, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.PageUp))
v = new Vector3(0, -1, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.PageDown))
v = new Vector3(0, 1, 0) * moveSpeed;
else
v = new Vector3(0, 0, 0);
view *= Matrix.CreateTranslation(v);
相机视图和投影:
view = Matrix.CreateLookAt(cameraPos, Vector3.Zero, Vector3.Up);
projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), ratio, 0.5f, 50f);
在这种情况下,cameraPos是0,0,10
。
编辑:投影 我最终得到了一个投影问题的图片。正如您所看到的,每个网格都有自己的阴影,而不是只有一个阴影穿过所有网格。
http://img843.imageshack.us/img843/8263/weirdshadowing.png
这是一个模型的俯视图。
graphics.PreferMultiSampling = true;
但正如我所说,我怀疑这并不是解决您问题的实际方法。您是否检查过分辨率? - Nico Schertler