Пример #1
0
        public void RenderSky(RGCamera rgCam, Light sunLight, RenderTargetIdentifier colorBuffer, RenderTargetIdentifier depthBuffer, CommandBuffer cmd /*, DebugDisplaySettings debugSettings*/)
        {
            using (new ProfilingSample(cmd, "Sky Pass"))
            {
                if (IsSkyValid())
                {
                    // Rendering the sky is the first time in the frame where we need fog parameters so we push them here for the whole frame.
                    m_SkySettings.atmosphericScatteringSettings.PushShaderParameters(cmd /*, debugSettings.renderingDebugSettings*/);

                    m_BuiltinParameters.commandBuffer = cmd;
                    m_BuiltinParameters.sunLight      = sunLight;
                    Vector4 screenSize = new Vector4(rgCam.camera.pixelWidth, rgCam.camera.pixelHeight, 1.0f / rgCam.camera.pixelWidth, 1.0f / rgCam.camera.pixelHeight);
                    m_BuiltinParameters.screenSize  = screenSize;
                    m_BuiltinParameters.colorBuffer = colorBuffer;
                    m_BuiltinParameters.depthBuffer = depthBuffer;
                    m_BuiltinParameters.pixelCoordToViewDirMatrix[0] = ComputePixelCoordToWorldSpaceViewDirectionMatrix(rgCam.camera.fieldOfView * Mathf.Deg2Rad, screenSize,
                                                                                                                        rgCam.StereoEnabled? rgCam.camera.GetStereoViewMatrix(Camera.StereoscopicEye.Left) : rgCam.camera.worldToCameraMatrix, false);
                    m_BuiltinParameters.invViewProjMatrix[0] = rgCam.MVPMatrix.inverse;
                    m_BuiltinParameters.cameraPosWS[0]       = rgCam.ClusterCameraPos;

                    if (rgCam.StereoEnabled)
                    {
                        m_BuiltinParameters.pixelCoordToViewDirMatrix[1] = ComputePixelCoordToWorldSpaceViewDirectionMatrix(rgCam.camera.fieldOfView * Mathf.Deg2Rad, screenSize, rgCam.camera.GetStereoViewMatrix(Camera.StereoscopicEye.Right), false);
                        m_BuiltinParameters.invViewProjMatrix[1]         = rgCam.MVPMatrix.inverse;
                        m_BuiltinParameters.cameraPosWS[1] = rgCam.ClusterCameraPos;
                    }

                    m_Renderer.SetRenderTargets(m_BuiltinParameters, rgCam.StereoEnabled);
                    m_Renderer.RenderSky(m_BuiltinParameters, rgCam.StereoEnabled, false);
                }
            }
        }
Пример #2
0
        public void UpdateEnvironment(RGCamera rgCam, Light sunLight, CommandBuffer cmd)
        {
            // We need one frame delay for this update to work since DynamicGI.UpdateEnvironment is executed directly but the renderloop is not (so we need to wait for the sky texture to be rendered first)
            if (m_NeedLowLevelUpdateEnvironment)
            {
                using (new ProfilingSample(cmd, "DynamicGI.UpdateEnvironment"))
                {
                    // TODO: Properly send the cubemap to Enlighten. Currently workaround is to set the cubemap in a Skybox/cubemap material
                    m_StandardSkyboxMaterial.SetTexture("_Tex", m_SkyboxCubemapRT);
                    RenderSettings.skybox              = IsSkyValid() ? m_StandardSkyboxMaterial : null; // Setup this material as the default to be use in RenderSettings
                    RenderSettings.ambientIntensity    = 1.0f;                                           // fix this to 1, this parameter should not exist!
                    RenderSettings.ambientMode         = AmbientMode.Skybox;                             // Force skybox for our HDRI
                    RenderSettings.reflectionIntensity = 1.0f;
                    RenderSettings.customReflection    = null;
                    DynamicGI.UpdateEnvironment();

                    m_NeedLowLevelUpdateEnvironment = false;
                }
            }

            if (IsSkyValid())
            {
                m_CurrentUpdateTime += Time.deltaTime;

                m_BuiltinParameters.commandBuffer  = cmd;
                m_BuiltinParameters.sunLight       = sunLight;
                m_BuiltinParameters.screenSize     = m_CubemapScreenSize;
                m_BuiltinParameters.cameraPosWS[0] = rgCam.camera.transform.position;

                if (m_UpdatedFramesRequired > 0 ||
                    (skySettings.updateMode == EnvironementUpdateMode.OnChanged && skySettings.GetHashCode() != m_SkyParametersHash) ||
                    (skySettings.updateMode == EnvironementUpdateMode.Realtime && m_CurrentUpdateTime > skySettings.updatePeriod))
                {
                    using (new ProfilingSample(cmd, "Sky Environment Pass"))
                    {
                        using (new ProfilingSample(cmd, "Update Env: Generate Lighting Cubemap"))
                        {
                            // Render sky into a cubemap - doesn't happen every frame, can be controlled
                            // Note that m_SkyboxCubemapRT is created with auto-generate mipmap, it mean that here we have also our mipmap correctly box filtered for importance sampling.
                            if (m_SkySettings.lightingOverride == null)
                            {
                                RenderSkyToCubemap(m_BuiltinParameters, skySettings, m_SkyboxCubemapRT);
                            }
                            // In case the user overrides the lighting, we already have a cubemap ready but we need to blit it anyway for potential resize and so that we can generate proper mipmaps for enlighten.
                            else
                            {
                                BlitCubemap(cmd, m_SkySettings.lightingOverride, m_SkyboxCubemapRT);
                            }
                        }

                        // Convolve downsampled cubemap
                        RenderCubemapGGXConvolution(cmd, m_BuiltinParameters, skySettings, m_SkyboxCubemapRT, m_SkyboxGGXCubemapRT);

                        m_NeedLowLevelUpdateEnvironment = true;
                        m_UpdatedFramesRequired--;
                        m_SkyParametersHash = skySettings.GetHashCode();
                        m_CurrentUpdateTime = 0.0f;
                        #if UNITY_EDITOR
                        // In the editor when we change the sky we want to make the GI dirty so when baking again the new sky is taken into account.
                        // Changing the hash of the rendertarget allow to say that GI is dirty
                        m_SkyboxCubemapRT.imageContentsHash = new Hash128((uint)skySettings.GetHashCode(), 0, 0, 0);
                        #endif
                    }
                }
            }
            else
            {
                if (m_SkyParametersHash != 0)
                {
                    using (new ProfilingSample(cmd, "Reset Sky Environment"))
                    {
                        // Clear temp cubemap and redo GGX from black and then feed it to enlighten for default light probe.
                        CoreUtils.ClearCubemap(cmd, m_SkyboxCubemapRT, Color.black);
                        RenderCubemapGGXConvolution(cmd, m_BuiltinParameters, skySettings, m_SkyboxCubemapRT, m_SkyboxGGXCubemapRT);

                        m_SkyParametersHash             = 0;
                        m_NeedLowLevelUpdateEnvironment = true;
                    }
                }
            }
        }