private void GeneratePipelineAsset(RenderSettingItem settings) { // store current quality level var currentQualityLevel = QualitySettings.GetQualityLevel(); //creating pipeline asset var asset = ScriptableObject.CreateInstance(typeof(UniversalRenderPipelineAsset)) as UniversalRenderPipelineAsset; if (!AssetDatabase.IsValidFolder($"Assets/{k_PipelineAssetPath}")) { AssetDatabase.CreateFolder("Assets", k_PipelineAssetPath); } var path = $"Assets/{k_PipelineAssetPath}/{settings.LevelName}_PipelineAsset.asset"; // Setting Pipeline Asset settings SetPipelineSettings(asset, settings); // Create Renderers var defaultIndex = 0; var renderers = new List <ScriptableRendererData>(); if (m_RenderingModes.Contains(RenderingMode.Forward)) { renderers.Add(CreateRendererDataAsset(path, RenderingPath.Forward, "ForwardRenderer")); if (GetEquivalentRenderMode(m_GraphicsTierSettings.RenderingPath) == RenderingMode.Forward) { defaultIndex = m_RenderingModes.IndexOf(RenderingMode.Forward); } } if (m_RenderingModes.Contains(RenderingMode.Deferred)) { renderers.Add(CreateRendererDataAsset(path, RenderingPath.DeferredShading, "DeferredRenderer")); if (GetEquivalentRenderMode(m_GraphicsTierSettings.RenderingPath) == RenderingMode.Deferred) { defaultIndex = m_RenderingModes.IndexOf(RenderingMode.Deferred); } } asset.m_RendererDataList = renderers.ToArray(); asset.m_DefaultRendererIndex = defaultIndex; // Create Pipeline asset on disk AssetDatabase.CreateAsset(asset, path); // Assign asset QualitySettings.SetQualityLevel(settings.Index); QualitySettings.renderPipeline = asset; // return to original quality level QualitySettings.SetQualityLevel(currentQualityLevel); // Set graphics settings if (currentQualityLevel == settings.Index || GraphicsSettings.defaultRenderPipeline == null || GraphicsSettings.defaultRenderPipeline.GetType() != typeof(UniversalRenderPipelineAsset)) { GraphicsSettings.defaultRenderPipeline = asset; } }
/// <summary> /// Iterates over all Quality Settings and saves relevant settings to a RenderSettingsItem. /// This will also create the required information for the Render Pipeline Converter UI. /// </summary> /// <param name="context">Converter context to add elements to.</param> private void GatherQualityLevels(ref InitializeConverterContext context) { var currentQuality = QualitySettings.GetQualityLevel(); var id = 0; foreach (var levelName in QualitySettings.names) { QualitySettings.SetQualityLevel(id); var projectSettings = new RenderSettingItem { Index = id, LevelName = levelName, PixelLightCount = QualitySettings.pixelLightCount, MSAA = QualitySettings.antiAliasing, Shadows = QualitySettings.shadows, ShadowResolution = QualitySettings.shadowResolution, ShadowDistance = QualitySettings.shadowDistance, ShadowCascadeCount = QualitySettings.shadowCascades, CascadeSplit2 = QualitySettings.shadowCascade2Split, CascadeSplit4 = QualitySettings.shadowCascade4Split, SoftParticles = QualitySettings.softParticles, }; m_SettingsItems.Add(projectSettings); var setting = QualitySettings.GetRenderPipelineAssetAt(id); var item = new ConverterItemDescriptor { name = $"Quality Level {id}: {levelName}" }; if (setting != null) { item.warningMessage = setting.GetType() == typeof(UniversalRenderPipelineAsset) ? "Contains URP Asset, will override existing asset." : "Contains SRP Asset, will override existing asset with URP asset."; } context.AddAssetToConvert(item); id++; } QualitySettings.SetQualityLevel(currentQuality); }
/// <summary> /// Sets all relevant RP settings in order they appear in URP /// </summary> /// <param name="asset">Pipeline asset to set</param> /// <param name="settings">The ProjectSettingItem with stored settings</param> private void SetPipelineSettings(UniversalRenderPipelineAsset asset, RenderSettingItem settings) { // General asset.supportsCameraDepthTexture = settings.SoftParticles; // Quality asset.supportsHDR = m_GraphicsTierSettings.HDR; asset.msaaSampleCount = settings.MSAA == 0 ? 1 : settings.MSAA; // Main Light asset.mainLightRenderingMode = settings.PixelLightCount == 0 ? LightRenderingMode.Disabled : LightRenderingMode.PerPixel; asset.supportsMainLightShadows = settings.Shadows != ShadowQuality.Disable; asset.mainLightShadowmapResolution = GetEquivalentMainlightShadowResolution((int)settings.ShadowResolution); // Additional Lights asset.additionalLightsRenderingMode = settings.PixelLightCount == 0 ? LightRenderingMode.PerVertex : LightRenderingMode.PerPixel; asset.maxAdditionalLightsCount = settings.PixelLightCount != 0 ? Mathf.Max(0, settings.PixelLightCount) : 4; asset.supportsAdditionalLightShadows = settings.Shadows != ShadowQuality.Disable; asset.additionalLightsShadowmapResolution = GetEquivalentAdditionalLightAtlasShadowResolution((int)settings.ShadowResolution); // Reflection Probes asset.reflectionProbeBlending = m_GraphicsTierSettings.ReflectionProbeBlending; asset.reflectionProbeBoxProjection = m_GraphicsTierSettings.ReflectionProbeBoxProjection; // Shadows asset.shadowDistance = settings.ShadowDistance; asset.shadowCascadeCount = m_GraphicsTierSettings.CascadeShadows ? settings.ShadowCascadeCount : 0; asset.cascade2Split = settings.CascadeSplit2; asset.cascade4Split = settings.CascadeSplit4; asset.supportsSoftShadows = settings.Shadows == ShadowQuality.All; }