CameraRenderType DrawCameraType() { int selectedRenderer = m_SerializedCamera.renderer.intValue; ScriptableRenderer scriptableRenderer = UniversalRenderPipeline.asset.GetRenderer(selectedRenderer); UniversalRenderer renderer = scriptableRenderer as UniversalRenderer; bool isDeferred = renderer != null ? renderer.renderingMode == RenderingMode.Deferred : false; EditorGUI.BeginChangeCheck(); //EditorGUILayout.PropertyField(m_AdditionalCameraDataCameraTypeProp, Styles.cameraType); CameraRenderType originalCamType = (CameraRenderType)m_SerializedCamera.cameraType.intValue; CameraRenderType camType = (originalCamType != CameraRenderType.Base && isDeferred) ? CameraRenderType.Base : originalCamType; camType = (CameraRenderType)EditorGUILayout.EnumPopup( Styles.cameraType, camType, e => { return(isDeferred ? (CameraRenderType)e != CameraRenderType.Overlay : true); }, false ); if (EditorGUI.EndChangeCheck() || camType != originalCamType) { m_SerializedCamera.cameraType.intValue = (int)camType; UpdateCameras(); } return(camType); }
void DrawCameraType() { int selectedRenderer = m_AdditionalCameraDataRendererProp.intValue; ScriptableRenderer scriptableRenderer = UniversalRenderPipeline.asset.GetRenderer(selectedRenderer); UniversalRenderer renderer = scriptableRenderer as UniversalRenderer; bool isDeferred = renderer != null ? renderer.renderingMode == RenderingMode.Deferred : false; EditorGUI.BeginChangeCheck(); //EditorGUILayout.PropertyField(m_AdditionalCameraDataCameraTypeProp, Styles.cameraType); CameraRenderType originalCamType = (CameraRenderType)m_AdditionalCameraDataCameraTypeProp.intValue; CameraRenderType camType = (originalCamType != CameraRenderType.Base && isDeferred) ? CameraRenderType.Base : originalCamType; camType = (CameraRenderType)EditorGUILayout.EnumPopup( Styles.cameraType, camType, e => { return(isDeferred ? (CameraRenderType)e != CameraRenderType.Overlay : true); }, false ); if (EditorGUI.EndChangeCheck() || camType != originalCamType) { m_AdditionalCameraDataCameraTypeProp.intValue = (int)camType; UpdateCameras(); // ScriptableRenderContext.SetupCameraProperties still depends on camera target texture // In order for overlay camera not to override base camera target texture we null it here if (camType == CameraRenderType.Overlay && settings.targetTexture.objectReferenceValue != null) { settings.targetTexture.objectReferenceValue = null; } } }
private static ShaderFeatures GetSupportedShaderFeatures(UniversalRenderPipelineAsset pipelineAsset) { ShaderFeatures shaderFeatures; shaderFeatures = ShaderFeatures.MainLight; if (pipelineAsset.supportsMainLightShadows) { shaderFeatures |= ShaderFeatures.MainLightShadows; } if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerVertex) { shaderFeatures |= ShaderFeatures.VertexLighting; } else if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerPixel) { shaderFeatures |= ShaderFeatures.AdditionalLights; if (pipelineAsset.supportsAdditionalLightShadows) { shaderFeatures |= ShaderFeatures.AdditionalLightShadows; } } bool anyShadows = pipelineAsset.supportsMainLightShadows || (shaderFeatures & ShaderFeatures.AdditionalLightShadows) != 0; if (pipelineAsset.supportsSoftShadows && anyShadows) { shaderFeatures |= ShaderFeatures.SoftShadows; } if (pipelineAsset.supportsMixedLighting) { shaderFeatures |= ShaderFeatures.MixedLighting; } if (pipelineAsset.supportsTerrainHoles) { shaderFeatures |= ShaderFeatures.TerrainHoles; } if (pipelineAsset.useFastSRGBLinearConversion) { shaderFeatures |= ShaderFeatures.UseFastSRGBLinearConversion; } if (pipelineAsset.supportsLightLayers) { shaderFeatures |= ShaderFeatures.LightLayers; } bool hasScreenSpaceShadows = false; bool hasScreenSpaceOcclusion = false; bool hasDeferredRenderer = false; bool withAccurateGbufferNormals = false; bool withoutAccurateGbufferNormals = false; int rendererCount = pipelineAsset.m_RendererDataList.Length; for (int rendererIndex = 0; rendererIndex < rendererCount; ++rendererIndex) { ScriptableRenderer renderer = pipelineAsset.GetRenderer(rendererIndex); if (renderer is UniversalRenderer) { UniversalRenderer universalRenderer = (UniversalRenderer)renderer; if (universalRenderer.renderingMode == RenderingMode.Deferred) { hasDeferredRenderer |= true; withAccurateGbufferNormals |= universalRenderer.accurateGbufferNormals; withoutAccurateGbufferNormals |= !universalRenderer.accurateGbufferNormals; } } // Check for Screen Space Ambient Occlusion Renderer Feature ScriptableRendererData rendererData = pipelineAsset.m_RendererDataList[rendererIndex]; if (rendererData != null) { for (int rendererFeatureIndex = 0; rendererFeatureIndex < rendererData.rendererFeatures.Count; rendererFeatureIndex++) { ScriptableRendererFeature rendererFeature = rendererData.rendererFeatures[rendererFeatureIndex]; ScreenSpaceShadows ssshadows = rendererFeature as ScreenSpaceShadows; hasScreenSpaceShadows |= ssshadows != null; ScreenSpaceAmbientOcclusion ssao = rendererFeature as ScreenSpaceAmbientOcclusion; hasScreenSpaceOcclusion |= ssao != null; } } } if (hasDeferredRenderer) { shaderFeatures |= ShaderFeatures.DeferredShading; } // We can only strip accurateGbufferNormals related variants if all DeferredRenderers use the same option. if (withAccurateGbufferNormals) { shaderFeatures |= ShaderFeatures.DeferredWithAccurateGbufferNormals; } if (withoutAccurateGbufferNormals) { shaderFeatures |= ShaderFeatures.DeferredWithoutAccurateGbufferNormals; } if (hasScreenSpaceShadows) { shaderFeatures |= ShaderFeatures.ScreenSpaceShadows; } if (hasScreenSpaceOcclusion) { shaderFeatures |= ShaderFeatures.ScreenSpaceOcclusion; } return(shaderFeatures); }
private static ShaderFeatures GetSupportedShaderFeatures(UniversalRenderPipelineAsset pipelineAsset) { ShaderFeatures shaderFeatures; shaderFeatures = ShaderFeatures.MainLight; if (pipelineAsset.supportsMainLightShadows) { shaderFeatures |= ShaderFeatures.MainLightShadows; } if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerVertex) { shaderFeatures |= ShaderFeatures.VertexLighting; } else if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerPixel) { shaderFeatures |= ShaderFeatures.AdditionalLights; } bool anyShadows = pipelineAsset.supportsMainLightShadows || (shaderFeatures & ShaderFeatures.AdditionalLightShadows) != 0; if (pipelineAsset.supportsSoftShadows && anyShadows) { shaderFeatures |= ShaderFeatures.SoftShadows; } if (pipelineAsset.supportsMixedLighting) { shaderFeatures |= ShaderFeatures.MixedLighting; } if (pipelineAsset.supportsTerrainHoles) { shaderFeatures |= ShaderFeatures.TerrainHoles; } if (pipelineAsset.useFastSRGBLinearConversion) { shaderFeatures |= ShaderFeatures.UseFastSRGBLinearConversion; } if (pipelineAsset.supportsLightLayers) { shaderFeatures |= ShaderFeatures.LightLayers; } bool hasScreenSpaceShadows = false; bool hasScreenSpaceOcclusion = false; bool hasDeferredRenderer = false; bool withAccurateGbufferNormals = false; bool withoutAccurateGbufferNormals = false; bool clusteredRendering = false; bool onlyClusteredRendering = false; bool usesRenderPass = false; int rendererCount = pipelineAsset.m_RendererDataList.Length; for (int rendererIndex = 0; rendererIndex < rendererCount; ++rendererIndex) { ScriptableRenderer renderer = pipelineAsset.GetRenderer(rendererIndex); if (renderer is UniversalRenderer) { UniversalRenderer universalRenderer = (UniversalRenderer)renderer; if (universalRenderer.renderingMode == RenderingMode.Deferred) { hasDeferredRenderer |= true; withAccurateGbufferNormals |= universalRenderer.accurateGbufferNormals; withoutAccurateGbufferNormals |= !universalRenderer.accurateGbufferNormals; usesRenderPass |= universalRenderer.useRenderPassEnabled; } } var rendererClustered = false; ScriptableRendererData rendererData = pipelineAsset.m_RendererDataList[rendererIndex]; if (rendererData != null) { for (int rendererFeatureIndex = 0; rendererFeatureIndex < rendererData.rendererFeatures.Count; rendererFeatureIndex++) { ScriptableRendererFeature rendererFeature = rendererData.rendererFeatures[rendererFeatureIndex]; ScreenSpaceShadows ssshadows = rendererFeature as ScreenSpaceShadows; hasScreenSpaceShadows |= ssshadows != null; // Check for Screen Space Ambient Occlusion Renderer Feature ScreenSpaceAmbientOcclusion ssao = rendererFeature as ScreenSpaceAmbientOcclusion; hasScreenSpaceOcclusion |= ssao != null; // Check for Decal Renderer Feature DecalRendererFeature decal = rendererFeature as DecalRendererFeature; if (decal != null) { var technique = decal.GetTechnique(renderer); switch (technique) { case DecalTechnique.DBuffer: shaderFeatures |= GetFromDecalSurfaceData(decal.GetDBufferSettings().surfaceData); break; case DecalTechnique.ScreenSpace: shaderFeatures |= GetFromNormalBlend(decal.GetScreenSpaceSettings().normalBlend); shaderFeatures |= ShaderFeatures.DecalScreenSpace; break; case DecalTechnique.GBuffer: shaderFeatures |= GetFromNormalBlend(decal.GetScreenSpaceSettings().normalBlend); shaderFeatures |= ShaderFeatures.DecalGBuffer; break; } } } if (rendererData is UniversalRendererData universalRendererData) { rendererClustered = universalRendererData.renderingMode == RenderingMode.Forward && universalRendererData.clusteredRendering; } } clusteredRendering |= rendererClustered; onlyClusteredRendering &= rendererClustered; } if (hasDeferredRenderer) { shaderFeatures |= ShaderFeatures.DeferredShading; } // We can only strip accurateGbufferNormals related variants if all DeferredRenderers use the same option. if (withAccurateGbufferNormals) { shaderFeatures |= ShaderFeatures.DeferredWithAccurateGbufferNormals; } if (withoutAccurateGbufferNormals) { shaderFeatures |= ShaderFeatures.DeferredWithoutAccurateGbufferNormals; } if (hasScreenSpaceShadows) { shaderFeatures |= ShaderFeatures.ScreenSpaceShadows; } if (hasScreenSpaceOcclusion) { shaderFeatures |= ShaderFeatures.ScreenSpaceOcclusion; } if (usesRenderPass) { shaderFeatures |= ShaderFeatures.RenderPassEnabled; } if (pipelineAsset.reflectionProbeBlending) { shaderFeatures |= ShaderFeatures.ReflectionProbeBlending; } if (pipelineAsset.reflectionProbeBoxProjection) { shaderFeatures |= ShaderFeatures.ReflectionProbeBoxProjection; } if (clusteredRendering) { shaderFeatures |= ShaderFeatures.ClusteredRendering; } if (onlyClusteredRendering) { shaderFeatures &= ~(ShaderFeatures.AdditionalLights | ShaderFeatures.VertexLighting); } if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerPixel || clusteredRendering) { if (pipelineAsset.supportsAdditionalLightShadows) { shaderFeatures |= ShaderFeatures.AdditionalLightShadows; } } return(shaderFeatures); }