0

我正在编写的应用程序中使用此示例项目的 XNA 4.0 表单控件:http: //creators.xna.com/en-US/sample/winforms_series1

它工作得很好,我在视觉和动画方面做了很多。我头疼的主要问题是我渲染的 3d 模型和原始 3D 形状(镶嵌为 30 的圆柱体)具有非常锯齿状的边缘,就好像它们是低分辨率的一样。

我试图弄清楚如何启用多重采样,但是我可以在网上找到的所有示例似乎都不适用于在自定义表单控件中使用 XNA 的这种新颖方式。

在 GraphicsDeviceService() 构造函数中创建了一个 PresentationParameters 对象,但唯一可用的属性是整数类型的 parameters.MultiSampleCount。我尝试设置它没有效果。

我还尝试将后台缓冲区设置为控件大小的两倍(GraphicsDeviceService.cs):

    GraphicsDeviceService(IntPtr windowHandle, int width, int height)
    {
        参数.BackBufferWidth = 宽度 * 2;
        参数.BackBufferHeight = 高度 * 2;
        ...
    }

然后我改变了这个函数(GraphicsDeviceControl.cs):

    无效结束绘制()
    {
        矩形 sourceRectangle = new Rectangle(0, 0, ClientSize.Width * 2, ClientSize.Height * 2);
        矩形destinationRectangle = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);
        GraphicsDevice.Present(sourceRectangle, destinationRectangle, this.Handle);
    }

但这并没有正常工作。我渲染到屏幕上的对象被降级为窗口的 1/4 并被剪裁。不过,它看起来确实没有那么锯齿……

所以在这一点上,我不确定我可以做些什么来使用这种方法(窗口中的 XNA 控件)获得高质量的图形。一般来说,我对 XNA 很陌生,所以任何建议都会很有帮助。

谢谢

4

3 回答 3

5

我下载了该代码示例以查看 PresentationParameters 的设置位置。这些是您需要修改的。

它在 GraphicsDeviceService 类中。

在该类的构造函数中,它设置了一个名为“parameters”的对象,即一个 PresentationParamters 对象。在 new 之后和将参数传递给 graphicsDevice 之前添加此行:

parameters.MultiSampleCount = 10;

我随意选择的那个值。它提供了健康的抗锯齿。如果您需要了解这个数字到底是什么,请阅读有关抗锯齿的更多信息。它是通过抗混叠滤波器的次数。因此,您可能希望降低它以获得更好的性能,或者提高它以获得更多抗锯齿。

于 2011-09-15T05:53:38.607 回答
2

您可以设置 GraphicsDeviceManager 的一些属性,确保它们都已完成。

graphics = new GraphicsDeviceManager(<A reference to your game class>)
{
  PreferMultiSampling = true,
};

graphics.PreparingDeviceSettings += (s, e) =>
{
  e.GraphicsDeviceInformation.PresentationParameters.MultiSampleCount = 16;
};
于 2011-09-16T13:17:14.740 回答
0

我有这个确切的问题。如果您在 windows 窗体中使用 XNA graphicsdevicecontrol 对象,那么简单地设置多重采样计数将不起作用。您必须在初始化部分修改 GraphicsDeviceService.cs。

查找此初​​始化,以便您可以在创建图形设备时而不是事后定义多重采样计数。

GraphicsDeviceService(IntPtr windowHandle, int width, int height)

{ 参数 = 新的 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;
        parameters.MultiSampleCount = 10; //  <--- RIGHT HERE

        graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
                                            GraphicsProfile.Reach,
                                            parameters);
    }

其他任何地方,图形设备将忽略您的更改

于 2012-09-27T14:52:25.483 回答