void OnPreRenderUnderwaterEffect() { // Ensure legacy underwater fog is disabled. if (_firstRender) { OceanRenderer.Instance.OceanMaterial.DisableKeyword("_OLD_UNDERWATER"); } RenderTextureDescriptor descriptor = XRHelpers.GetRenderTextureDescriptor(_camera); descriptor.useDynamicScale = _camera.allowDynamicResolution; // Format must be correct for CopyTexture to work. Hopefully this is good enough. if (_camera.allowHDR) { descriptor.colorFormat = RenderTextureFormat.DefaultHDR; } var temporaryColorBuffer = RenderTexture.GetTemporary(descriptor); UpdatePostProcessMaterial( _camera, _underwaterEffectMaterial, _sphericalHarmonicsData, _meniscus, _firstRender || _copyOceanMaterialParamsEachFrame, _debug._viewOceanMask, // horizonSafetyMarginMultiplier is added to the horizon, so no-op is zero. _useHorizonSafetyMarginMultiplier ? _horizonSafetyMarginMultiplier : 0f, // farPlaneMultiplier is multiplied to the far plane, so no-op is one. _useHorizonSafetyMarginMultiplier ? 1f : _farPlaneMultiplier, _filterOceanData, s_xrPassIndex ); _underwaterEffectCommandBuffer.Clear(); if (_camera.allowMSAA) { // Use blit if MSAA is active because transparents were not included with CopyTexture. // Not sure if we need an MSAA resolve? Not sure how to do that... _underwaterEffectCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, temporaryColorBuffer); } else { // Copy the frame buffer as we cannot read/write at the same time. If it causes problems, replace with Blit. _underwaterEffectCommandBuffer.CopyTexture(BuiltinRenderTextureType.CameraTarget, temporaryColorBuffer); } _underwaterEffectMaterial.SetTexture(sp_CrestCameraColorTexture, temporaryColorBuffer); _underwaterEffectCommandBuffer.SetRenderTarget(BuiltinRenderTextureType.CameraTarget, 0, CubemapFace.Unknown, -1); _underwaterEffectCommandBuffer.DrawProcedural(Matrix4x4.identity, _underwaterEffectMaterial.material, -1, MeshTopology.Triangles, 3, 1); RenderTexture.ReleaseTemporary(temporaryColorBuffer); }
void OnPreRenderOceanMask() { RenderTextureDescriptor descriptor = XRHelpers.GetRenderTextureDescriptor(_camera); descriptor.useDynamicScale = _camera.allowDynamicResolution; InitialiseMaskTextures(descriptor, ref _maskTexture, ref _depthTexture); _oceanMaskCommandBuffer.Clear(); // Passing -1 to depth slice binds all slices. Important for XR SPI to work in both eyes. _oceanMaskCommandBuffer.SetRenderTarget(_maskTexture.colorBuffer, _depthTexture.depthBuffer, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); _oceanMaskCommandBuffer.ClearRenderTarget(true, true, Color.white * UNDERWATER_MASK_NO_MASK); _oceanMaskCommandBuffer.SetGlobalTexture(sp_CrestOceanMaskTexture, _maskTexture.colorBuffer); _oceanMaskCommandBuffer.SetGlobalTexture(sp_CrestOceanMaskDepthTexture, _depthTexture.depthBuffer); PopulateOceanMask( _oceanMaskCommandBuffer, _camera, OceanRenderer.Instance.Tiles, _cameraFrustumPlanes, _oceanMaskMaterial.material, _debug._disableOceanMask ); }