切换 Unity 交换链的 MSAA 采样数。
该值指示每个像素的采样数。有效值为 0(使用质量设置值)、1、2、4 和 8。如果图形 API 不支持您提供的值,它将使用下一个受支持的最高值。此函数是一种底层方法,不会影响渲染状态或设置。它设置已分配系统渲染目标的格式。Unity 不会立即更改采样数。具体发生更改的时间取决于平台。在某些平台上,在帧中尽早调用此方法可能会在该帧内产生影响,但在其他平台上可能会推迟到下一帧,因为切换是在帧的末尾进行的。
只有在使用可编程渲染管线时此函数才可用,如果与内置管线一起使用,它将记录一条错误。它使渲染管线内部组件能够从脚本控制系统渲染目标。从脚本设置此项不会对渲染管线启用 MSAA。有关如何为当前使用的渲染管线启用 MSAA 渲染的信息,请参阅渲染管线文档。
如果您编写自己的渲染管线,您很可能会希望作为渲染管线后期处理链的一部分执行自己的解决。在这种情况下,为了获得最佳性能,建议将采样数设置为“1”以禁用系统渲染目标上的 MSAA。如果该值设置为 0(默认值),则行为与内置管线相同,即它使用质量设置中保存的 msaa 采样计数,并且 Unity 可能会分配一个 MSAA 渲染目标,但由于您的渲染管线已作为其后期处理的一部分执行解析,因此不需要该目标。
此示例勾勒出如何将 SetMSAASamples 与渲染管线自身的 MSAA 设置结合使用以确保正确配置系统渲染目标,使其适合自己的用例
using UnityEngine; using UnityEngine.Rendering;
[CreateAssetMenu(menuName = "MyRenderPipeline/Create New Pipeline Asset")] public class MyRenderPipelineAsset : RenderPipelineAsset { public int msaaSamples = 1; public bool directToScreen = false;
protected override RenderPipeline CreatePipeline() { return new MyRenderPipeline(this); } }
public class MyRenderPipeline : RenderPipeline { MyRenderPipelineAsset asset;
public MyRenderPipeline(MyRenderPipelineAsset asset) { this.asset = asset; if (asset.directToScreen) { Screen.SetMSAASamples(asset.msaaSamples); } else { Screen.SetMSAASamples(1); } }
protected override void Render(ScriptableRenderContext context, Camera[] cameras) { // Render frame, culling shadow maps ...
// Final output to screen if (asset.directToScreen) { // Render geometry directly to system buffer no post processing is possible // the system provies the MSAA resolve as part of the final screen blit or desktop compositor } else { // Post processing resolves MSAA and eventually writes single sample data to the sceen } } }