public PlatformLoader(SiraLog siraLog, BloomPrePassRendererSO bloomPrepassRenderer, BloomPrePassEffectContainerSO bloomPrePassEffectContainer) { _siraLog = siraLog; _bloomPrepassRenderer = bloomPrepassRenderer; _bloomPrePassEffectContainer = bloomPrePassEffectContainer; _pathTaskPairs = new Dictionary <string, Task <CustomPlatform?> >(); }
private void ApplyBloomEffect(Camera camera) { //TODO Fix SmoothCamera instead of skipping. Current workaround is to use CameraPlus instead. Investigate what BloomPrePassRendererSO does differently //Mirror cam has no BloomPrePass if (camera.name == "SmoothCamera" || camera.name.StartsWith("MirrorCam")) { return; } if (BloomIntensity == 0) { return; } try { GetPrivateFields(camera); } catch (Exception e) { Log.Error(e); if (!_bloomPrePassDict.ContainsKey(camera)) { _bloomPrePassDict.Add(camera, null); } } _bloomPrePassDict.TryGetValue(camera, out var bloomPrePass); if (bloomPrePass == null) { return; } var rendererFound = _bloomPrePassRendererDict.TryGetValue(camera, out var bloomPrePassRenderer); var paramsFound = _bloomPrePassParamsDict.TryGetValue(camera, out var bloomPrePassParams); var renderDataFound = _bloomPrePassRenderDataDict.TryGetValue(camera, out var bloomPrePassRenderData); //Never the case in my testing, but better safe than sorry if (!rendererFound || !paramsFound || !renderDataFound) { return; } var sRGBWrite = GL.sRGBWrite; GL.sRGBWrite = false; bloomPrePassRenderer !.GetCameraParams(camera, out var projectionMatrix, out _, out var stereoCameraEyeOffset); //The next few lines are taken from bloomPrePassRenderer.RenderAndSetData() var textureToScreenRatio = new Vector2 { x = Mathf.Clamp01((float)(1.0 / ((double)Mathf.Tan((float)(bloomPrePassParams !.fov.x * 0.5 * (Math.PI / 180.0))) * projectionMatrix.m00))), y = Mathf.Clamp01((float)(1.0 / ((double)Mathf.Tan((float)(bloomPrePassParams.fov.y * 0.5 * (Math.PI / 180.0))) * projectionMatrix.m11))) }; projectionMatrix.m00 *= textureToScreenRatio.x; projectionMatrix.m02 *= textureToScreenRatio.x; projectionMatrix.m11 *= textureToScreenRatio.y; projectionMatrix.m12 *= textureToScreenRatio.y; var temporary = RenderTexture.GetTemporary(bloomPrePassParams.textureWidth, bloomPrePassParams.textureHeight, 0, RenderTextureFormat.RGB111110Float, RenderTextureReadWrite.Linear); Graphics.SetRenderTarget(temporary); GL.Clear(true, true, Color.black); GL.PushMatrix(); GL.LoadProjectionMatrix(projectionMatrix); _renderer.material.SetPass(0); var transformTemp = transform; Graphics.DrawMeshNow(_mesh, Matrix4x4.TRS(transformTemp.position, transformTemp.rotation, transformTemp.lossyScale)); GL.PopMatrix(); var boost = GetBloomBoost(camera); var blur2 = RenderTexture.GetTemporary(bloomPrePassParams.textureWidth >> DOWNSAMPLE, bloomPrePassParams.textureHeight >> DOWNSAMPLE, 0, RenderTextureFormat.RGB111110Float, RenderTextureReadWrite.Linear); DoubleBlur(temporary, blur2, KawaseBlurRendererSO.KernelSize.Kernel127, boost, KawaseBlurRendererSO.KernelSize.Kernel35, boost, 0.5f, DOWNSAMPLE); Graphics.Blit(blur2, bloomPrePassRenderData !.bloomPrePassRenderTexture, _additiveMaterial); RenderTexture.ReleaseTemporary(temporary); RenderTexture.ReleaseTemporary(blur2); BloomPrePassRendererSO.SetDataToShaders(stereoCameraEyeOffset, textureToScreenRatio, bloomPrePassRenderData.bloomPrePassRenderTexture, bloomPrePassRenderData.toneMapping); GL.sRGBWrite = sRGBWrite; }