所以我最近开始使用SharpDX,并且偶然发现了一个问题。我不知道如何让SharpDX进行多重采样。我发现了两件相关的事情;您可以在创建SwapChainDescription时指定SampleDescription,但除(1,0)之外的任何输入都会抛出错误的参数异常。
我发现的另一件事是SamplerState,我放在我的像素着色器上,没有做任何事情。我用参数玩了很多,但没有任何明显的变化。
我确信我错过了一些东西,但是没有任何先前的directX knowlegde我真的不知道究竟要找什么。
答案 0 :(得分:3)
这将在您的情况下派上用场:
int maxsamples = Device.MultisampleCountMaximum;
int res = device.CheckMultisampleQualityLevels(SharpDX.DXGI.Format.R8G8B8A8_UNorm, samplecount);
如果res返回0,则不支持此Sample count。
另请注意,某些选项不兼容,因此如果您创建SwapChain:
sd.Usage = (other usages) | Usage.UnorderedAccess;
您不能使用多重采样。
另一种非常有用的技术可以发现这些错误的问题:
使用DeviceCreationFlags.Debug
创建您的设备在启动项目属性(调试部分)中,勾选"启用本机代码调试"。
任何失败的API调用都会在调试输出窗口中显示错误说明。
答案 1 :(得分:0)
我遇到了同样的问题,在启用调试并得到一个很好的提示之前无法让Multisampling工作(真的希望我在几小时前完成并节省了大量的测试!)。
最初,我在某处读到DepthStencilBuffer与渲染纹理具有相同的SampleDescription - 但我不太确定,因为它似乎没有这个就像刚刚显示的快速测试一样。
对我来说,最重要的是使用DepthStencilViewDescription创建DepthStencilView,其中“Dimension = DepthStencilViewDimension.Texture2DMultisampled”。
答案 2 :(得分:0)
当您进行多重采样时,请注意。
设置rendertarget时,如果传递rendertarget和depthstencil,则需要确保它们都具有相同的多重采样级别。
因此,要渲染到使用MSAA定义的后备缓冲区,您需要创建具有相同MSAA级别的深度缓冲区。
但是,如果你有一个rendertarget,它将是一个反馈到管道的纹理,你可以定义一个非MSAA纹理和一个NON MSAA深度缓冲区,这很方便,因为你可以在纹理上使用一个采样器(你不能使用普通的采样器来获得MSAA资源纹理。)
这些信息大部分对您来说可能并不新鲜。