public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if (renderingData.cameraData.camera != Camera.main) { return; } VolumeStack stack = VolumeManager.instance.stack; PUnderwaterOverride underwater = stack.GetComponent <PUnderwaterOverride>(); PWetLensOverride wetLens = stack.GetComponent <PWetLensOverride>(); bool willRenderUnderwater = underwater.intensity.value > 0; bool willRenderWetLens = wetLens.strength.value * wetLens.intensity.value > 0; if (!willRenderUnderwater && !willRenderWetLens) { return; } ConfigureMaterial(ref renderingData, underwater, wetLens); CommandBuffer cmd = CommandBufferPool.Get(PROFILER_TAG); RenderTextureDescriptor cameraTargetDescriptor = renderingData.cameraData.cameraTargetDescriptor; cameraTargetDescriptor.depthBufferBits = 0; cmd.GetTemporaryRT(temporaryRenderTexture.id, cameraTargetDescriptor); Material material = willRenderUnderwater ? underwaterMaterial : wetLensMaterial; Blit(cmd, cameraTarget, temporaryRenderTexture.Identifier(), material, 0); Blit(cmd, temporaryRenderTexture.Identifier(), cameraTarget); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); }
private void ConfigureMaterial(ref RenderingData renderingData, PUnderwaterOverride underwater, PWetLensOverride wetLens) { if (underwater.intensity.value > 0) { if (underwaterMaterial == null) { Shader shader = PPoseidonSettings.Instance.UnderwaterShaderURP; underwaterMaterial = CoreUtils.CreateEngineMaterial(shader); } underwaterMaterial.SetFloat(PMat.PP_WATER_LEVEL, underwater.waterLevel.value); underwaterMaterial.SetFloat(PMat.PP_MAX_DEPTH, underwater.maxDepth.value); underwaterMaterial.SetFloat(PMat.PP_SURFACE_COLOR_BOOST, underwater.surfaceColorBoost.value); underwaterMaterial.SetColor(PMat.PP_SHALLOW_FOG_COLOR, underwater.shallowFogColor.value); underwaterMaterial.SetColor(PMat.PP_DEEP_FOG_COLOR, underwater.deepFogColor.value); underwaterMaterial.SetFloat(PMat.PP_VIEW_DISTANCE, underwater.viewDistance.value); if (underwater.enableCaustic.value == true) { underwaterMaterial.EnableKeyword(PMat.KW_PP_CAUSTIC); underwaterMaterial.SetTexture(PMat.PP_CAUSTIC_TEX, underwater.causticTexture.value); underwaterMaterial.SetFloat(PMat.PP_CAUSTIC_SIZE, underwater.causticSize.value); underwaterMaterial.SetFloat(PMat.PP_CAUSTIC_STRENGTH, underwater.causticStrength.value); } else { underwaterMaterial.DisableKeyword(PMat.KW_PP_CAUSTIC); } if (underwater.enableDistortion.value == true) { underwaterMaterial.EnableKeyword(PMat.KW_PP_DISTORTION); underwaterMaterial.SetTexture(PMat.PP_DISTORTION_TEX, underwater.distortionNormalMap.value); underwaterMaterial.SetFloat(PMat.PP_DISTORTION_STRENGTH, underwater.distortionStrength.value); underwaterMaterial.SetFloat(PMat.PP_WATER_FLOW_SPEED, underwater.waterFlowSpeed.value); } else { underwaterMaterial.DisableKeyword(PMat.KW_PP_DISTORTION); } underwaterMaterial.SetTexture(PMat.PP_NOISE_TEX, PPoseidonSettings.Instance.NoiseTexture); underwaterMaterial.SetVector(PMat.PP_CAMERA_VIEW_DIR, renderingData.cameraData.camera.transform.forward); underwaterMaterial.SetFloat(PMat.PP_CAMERA_FOV, renderingData.cameraData.camera.fieldOfView); underwaterMaterial.SetMatrix(PMat.PP_CAMERA_TO_WORLD_MATRIX, renderingData.cameraData.camera.cameraToWorldMatrix); underwaterMaterial.SetFloat(PMat.PP_INTENSITY, underwater.intensity.value); } if (wetLens.strength.value * wetLens.intensity.value > 0) { if (wetLensMaterial == null) { Shader shader = PPoseidonSettings.Instance.WetLensShaderURP; wetLensMaterial = CoreUtils.CreateEngineMaterial(shader); } Texture normalMap = wetLens.normalMap.value ?? PPoseidonSettings.Instance.DefaultNormalMap; wetLensMaterial.SetTexture(PMat.PP_WET_LENS_TEX, normalMap); wetLensMaterial.SetFloat(PMat.PP_WET_LENS_STRENGTH, wetLens.strength.value * wetLens.intensity.value); } }