【问题标题】:Method for high quality output in XNA 4.0XNA 4.0 中高质量输出的方法
【发布时间】:2011-09-15 03:14:35
【问题描述】:

我正在编写的应用程序中使用此示例项目的 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 很陌生,所以任何建议都会很有帮助。

【问题讨论】:

    标签: 3d xna xna-4.0 multisampling


    【解决方案1】:

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

    它在 GraphicsDeviceService 类中。

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

    parameters.MultiSampleCount = 10;
    

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

    【讨论】:

    • 很抱歉没有完整阅读您的答案,看来您已经尝试过 MultiSampleCount。似乎您可能没有尝试过许多不同的值。尝试更高的值;对我来说,当它是 1-2 时,我绝对可以看到锯齿状的边缘,当我将它增加到 10 时,边缘非常光滑。我已经使用代码示例附带的默认模型进行了测试,例如 Cylinder、SpaceShip 等。
    • 我的意思也是问题!上帝,我累了,对不起。
    • 感谢 Scott 的帮助。在我的情况下,它似乎没有效果。也许是我正在使用的笔记本电脑无法使用? (具有英特尔集成显卡)。如果它完全依赖于硬件,我将不得不寻找另一种方法。
    • 什么硬件型号? Reach 和 HiDef 图形配置文件都支持多重采样,但您的硬件对启用哪些功能拥有最终决定权。
    • 来自这个链接:msdn.microsoft.com/en-us/library/… 如果硬件不支持多重采样,它似乎会被忽略。
    【解决方案2】:

    GraphicsDeviceManager 有几个属性可以设置,确保都设置好了。

    graphics = new GraphicsDeviceManager(<A reference to your game class>)
    {
      PreferMultiSampling = true,
    };
    
    graphics.PreparingDeviceSettings += (s, e) =>
    {
      e.GraphicsDeviceInformation.PresentationParameters.MultiSampleCount = 16;
    };
    

    【讨论】:

    • 游戏类在 windows 窗体方法中不可用。
    【解决方案3】:

    我遇到了这个确切的问题。如果您在 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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2017-04-26
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      相关资源
      最近更新 更多