XNA 4.0在有锯齿边缘问题的窗口中…知道高质量输出的方法吗?

XNA 4.0在有锯齿边缘问题的窗口中…知道高质量输出的方法吗?,xna,3d,xna-4.0,high-resolution,multisampling,Xna,3d,Xna 4.0,High Resolution,Multisampling,我正在编写的应用程序中使用此示例项目的XNA 4.0表单控件: 它工作得很好,我在视觉和动画方面做了不少工作。让我挠头的主要问题是我渲染的3d模型和原始3d形状(具有30个细分的圆柱体)的边缘非常参差不齐,就好像它们的分辨率很低一样 我试图找出如何启用多重采样,但我在网上找到的所有示例似乎都不适用于在自定义表单控件中使用XNA的这种新颖方式 GraphicsDeviceService()构造函数中创建了一个PresentationParameters对象,但唯一可用的属性是integer类型的

我正在编写的应用程序中使用此示例项目的XNA 4.0表单控件:

它工作得很好,我在视觉和动画方面做了不少工作。让我挠头的主要问题是我渲染的3d模型和原始3d形状(具有30个细分的圆柱体)的边缘非常参差不齐,就好像它们的分辨率很低一样

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

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

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

GraphicsDeviceService(IntPtr windowHandle, int width, int height) { parameters.BackBufferWidth = width * 2; parameters.BackBufferHeight = height * 2; ... } void EndDraw() { Rectangle sourceRectangle = new Rectangle(0, 0, ClientSize.Width * 2, ClientSize.Height * 2); Rectangle destinationRectangle = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height); GraphicsDevice.Present(sourceRectangle, destinationRectangle, this.Handle); } GraphicsDeviceService(IntPtr窗口句柄、int宽度、int高度) { parameters.BackBufferWidth=宽度*2; parameters.BackBufferHeight=高度*2; ... } 然后我更改了这个函数(graphicsdevicontrol.cs):

GraphicsDeviceService(IntPtr windowHandle, int width, int height) { parameters.BackBufferWidth = width * 2; parameters.BackBufferHeight = height * 2; ... } void EndDraw() { Rectangle sourceRectangle = new Rectangle(0, 0, ClientSize.Width * 2, ClientSize.Height * 2); Rectangle destinationRectangle = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height); GraphicsDevice.Present(sourceRectangle, destinationRectangle, this.Handle); } void EndDraw() { 矩形sourceRectangle=新矩形(0,0,ClientSize.Width*2,ClientSize.Height*2); 矩形目标矩形=新矩形(0,0,ClientSize.Width,ClientSize.Height); GraphicsDevice.Present(sourceRectangle、destinationRectangle、this.Handle); } 但这并没有正常工作。渲染到屏幕上的对象被降级到窗口的1/4并被剪裁。但它看起来确实没有那么参差不齐

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


谢谢

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

它在GraphicsDeviceService类中

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

parameters.MultiSampleCount = 10;

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

可以设置GraphicsDeviceManager的一些属性,请确保它们都已设置完毕

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

graphics.PreparingDeviceSettings += (s, e) =>
{
  e.GraphicsDeviceInformation.PresentationParameters.MultiSampleCount = 16;
};
graphics=newgraphicsdevicemanager()
{
首选多重采样=真,
};
graphics.PreparingDeviceSettings+=(s,e)=>
{
e、 GraphicsDeviceInformation.PresentationParameters.MultiSampleCount=16;
};

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

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

GraphicsDeviceService(IntPtr窗口句柄、int宽度、int高度)

{ 参数=新的PresentationParameters()

parameters.BackBufferWidth=Math.Max(宽度,1);
parameters.BackBufferHeight=Math.Max(高度,1);
parameters.BackBufferFormat=SurfaceFormat.Color;
parameters.DepthStencilFormat=DepthFormat.Depth24;
parameters.DeviceWindowHandle=windowHandle;
parameters.PresentationInterval=PresentInterval.Immediate;
parameters.IsFullScreen=false;

parameters.MultiSampleCount=10;//我很抱歉没有完全阅读您的答案,您似乎已经尝试了MultiSampleCount。您可能还没有尝试过很多不同的值。请尝试更高的值;对我来说,当它为1-2时,我肯定可以看到锯齿状的边,当我将其增加到10时,边非常平滑。我有个测试ted使用了代码示例附带的默认型号,如圆柱体、宇宙飞船等。我的意思是提问!天哪,我累了,对不起。我感谢你的帮助斯科特。这似乎对我的情况没有影响。也许是我正在使用的笔记本电脑无法使用?(具有英特尔集成图形)。如果它完全依赖于硬件,我将不得不寻找另一种方法。它是什么硬件型号?在Reach和HiDef图形配置文件中都支持多重采样,但您的硬件对启用哪些功能有最终决定权。从此链接:如果硬件不支持多重采样,则似乎忽略了多重采样。游戏类不支持多重采样可通过windows窗体方法获得。