private void CameraPreCull(Camera camera) { if (!WeatherMakerScript.ShouldIgnoreCamera(this, camera)) { commandBuffer.Clear(); if (BlurMaterial != null) { RenderTextureFormat format = (camera.allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default); RenderTextureDescriptor desc1 = WeatherMakerFullScreenEffect.GetRenderTextureDescriptor((int)Scale, 1, 1, format, 0, camera); RenderTextureDescriptor desc2 = WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(1, 1, 1, format, 0, camera); commandBuffer.GetTemporaryRT(WMS._MainTex2, desc1); commandBuffer.GetTemporaryRT(WMS._MainTex3, desc2); commandBuffer.SetRenderTarget(WMS._MainTex2); commandBuffer.ClearRenderTarget(true, true, Color.clear); commandBuffer.SetGlobalFloat(WMS._WeatherMakerDownsampleScale, (float)Scale); commandBuffer.DrawRenderer(Renderer, Renderer.sharedMaterial, 0, 0); // draw pass commandBuffer.SetRenderTarget(WMS._MainTex3); commandBuffer.ClearRenderTarget(true, true, Color.clear); commandBuffer.DrawRenderer(Renderer, Renderer.sharedMaterial, 0, 1); // depth pass commandBuffer.SetGlobalTexture(WMS._WeatherMakerTemporaryDepthTexture, WMS._MainTex3); commandBuffer.SetGlobalFloat(WMS._DstBlendMode, (float)BlendMode.OneMinusSrcAlpha); commandBuffer.Blit(WMS._MainTex2, WeatherMakerFullScreenEffect.CameraTargetIdentifier(), BlurMaterial, 0); commandBuffer.ReleaseTemporaryRT(WMS._MainTex2); commandBuffer.ReleaseTemporaryRT(WMS._MainTex3); camera.AddCommandBuffer(CameraEvent, commandBuffer); } } }
private void CameraPreCull(Camera camera) { if (WeatherMakerCommandBufferManagerScript.CameraStack == 1 && WeatherMakerScript.GetCameraType(camera) == WeatherMakerCameraType.Normal) { // render cloud shadows at half scale for large screens int scale = (WeatherMakerScript.Instance == null || WeatherMakerScript.Instance.PerformanceProfile == null ? (UnityEngine.XR.XRDevice.isPresent || Screen.width > 2000 ? 4 : 2) : (int)WeatherMakerScript.Instance.PerformanceProfile.VolumetricCloudShadowDownsampleScale); tempShadowBuffer = RenderTexture.GetTemporary(WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(scale, 0, 1, RenderTextureFormat.ARGB32, 0, camera)); tempShadowBuffer.wrapMode = TextureWrapMode.Clamp; tempShadowBuffer.filterMode = FilterMode.Bilinear; AddScreenSpaceShadowsCommandBuffer(camera); // ensure that the any shader using cloud shadows knows the correct cloud shadow parameters if (CloudShadowMaterial != null) { Shader.SetGlobalFloat(WMS._CloudShadowMapAdder, CloudShadowMaterial.GetFloat(WMS._CloudShadowMapAdder)); Shader.SetGlobalFloat(WMS._CloudShadowMapMultiplier, CloudShadowMaterial.GetFloat(WMS._CloudShadowMapMultiplier)); Shader.SetGlobalFloat(WMS._CloudShadowMapPower, CloudShadowMaterial.GetFloat(WMS._CloudShadowMapPower)); Shader.SetGlobalFloat(WMS._WeatherMakerCloudVolumetricShadowDither, CloudShadowMaterial.GetFloat(WMS._WeatherMakerCloudVolumetricShadowDither)); Shader.SetGlobalTexture(WMS._WeatherMakerCloudShadowDetailTexture, CloudShadowMaterial.GetTexture(WMS._WeatherMakerCloudShadowDetailTexture)); Shader.SetGlobalFloat(WMS._WeatherMakerCloudShadowDetailScale, CloudShadowMaterial.GetFloat(WMS._WeatherMakerCloudShadowDetailScale)); Shader.SetGlobalFloat(WMS._WeatherMakerCloudShadowDetailIntensity, CloudShadowMaterial.GetFloat(WMS._WeatherMakerCloudShadowDetailIntensity)); Shader.SetGlobalFloat(WMS._WeatherMakerCloudShadowDetailFalloff, CloudShadowMaterial.GetFloat(WMS._WeatherMakerCloudShadowDetailFalloff)); Shader.SetGlobalFloat(WMS._WeatherMakerCloudShadowDistanceFade, CloudShadowMaterial.GetFloat(WMS._WeatherMakerCloudShadowDistanceFade)); } } }
public void PreCullFrame(Camera camera, WeatherMakerDownsampleScale scale, WeatherMakerTemporalReprojectionSize projSize) { if (TemporalReprojectionMaterial == null) { return; } WeatherMakerCameraType cameraType = WeatherMakerScript.GetCameraType(camera); if (cameraType == WeatherMakerCameraType.Other) { return; } int projSizeInt = (int)projSize; int downsampling = (int)scale; int frameWidth = camera.pixelWidth / downsampling; int frameHeight = camera.pixelHeight / downsampling; // ensure reprojection fits cleanly into frame while (frameWidth % projSizeInt != 0) { frameWidth++; } while (frameHeight % projSizeInt != 0) { frameHeight++; } if (frameWidth != FrameWidth || frameHeight != FrameHeight || ReprojectionSize != projSizeInt) { DisposeRenderTextures(); ReprojectionSize = projSizeInt; ReprojectionSizeSquared = ReprojectionSize * ReprojectionSize; CreateFrameNumbers(); FrameWidth = frameWidth; FrameHeight = frameHeight; SubFrameWidth = frameWidth / projSizeInt; SubFrameHeight = frameHeight / projSizeInt; RenderTextureFormat format = camera.allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; RenderTextureDescriptor descSubFrame = WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(downsampling, projSizeInt, projSizeInt, format, 0, camera); subFrameCurrent = WeatherMakerFullScreenEffect.CreateRenderTexture(descSubFrame, FilterMode.Bilinear, TextureWrapMode.Clamp); subFrameCurrent.name = "WeatherMakerTemporalReprojectionSubFrame"; RenderTextureDescriptor descPrevFrame = WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(downsampling, projSizeInt, 1, format, 0, camera); prevFrameCurrent = WeatherMakerFullScreenEffect.CreateRenderTexture(descPrevFrame, FilterMode.Bilinear, TextureWrapMode.Clamp); prevFrameCurrent.name = "WeatherMakerTemporalReprojectionPrevFrame"; OffsetXConstant = (1.0f / (float)frameWidth); OffsetYConstant = (1.0f / (float)frameHeight); OffsetXConstant2 = (-0.5f * (float)(ReprojectionSize - 1) * OffsetXConstant); OffsetYConstant2 = (-0.5f * (float)(ReprojectionSize - 1) * OffsetYConstant); NeedsFirstFrameHandling = true; } ComputeTemporalOffsets(); }
private RenderTargetIdentifier UpdateDepthDownsampler(ref RenderTexture tex, int scale) { RenderTextureDescriptor desc = WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(scale, 0, 1, RenderTextureFormat.RFloat); if (tex == null || tex.width != desc.width || tex.height != desc.height) { WeatherMakerFullScreenEffect.DestroyRenderTexture(ref tex); tex = WeatherMakerFullScreenEffect.CreateRenderTexture(desc, FilterMode.Point, TextureWrapMode.Clamp); tex.name = "WeatherMakerDepthTexture_" + scale; } return(tex); }
private void CreateAfterForwardOpaqueCommandBuffer(Camera camera) { #if ENABLE_FORWARD_OPAQUE_CAPTURE if (afterForwardOpaqueCommandBuffer != null) { camera.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, afterForwardOpaqueCommandBuffer); camera.RemoveCommandBuffer(CameraEvent.AfterSkybox, afterForwardOpaqueCommandBuffer); } if (afterForwardOpaqueCommandBuffer == null || (AfterOpaqueBuffer != null && (AfterOpaqueBuffer.width != camera.pixelWidth || AfterOpaqueBuffer.height != camera.pixelHeight))) { if (AfterOpaqueBuffer != null) { AfterOpaqueBuffer.Clear(); AfterOpaqueBuffer.Release(); Destroy(AfterOpaqueBuffer); AfterOpaqueBuffer = WeatherMakerFullScreenEffect.CreateRenderTexture(WeatherMakerFullScreenEffect.GetRenderTextureDescriptor(1, 1, 1, RenderTextureFormat.DefaultHDR, 0, camera)); } afterForwardOpaqueCommandBuffer = new CommandBuffer { name = afterForwardOpaqueCommandBufferName + Time.unscaledDeltaTime }; afterForwardOpaqueCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, AfterOpaqueBuffer); afterForwardOpaqueCommandBuffer.SetGlobalTexture(WMS._CameraOpaqueTexture, AfterOpaqueBuffer); } if (camera.clearFlags == CameraClearFlags.Skybox) { camera.AddCommandBuffer(CameraEvent.AfterSkybox, afterForwardOpaqueCommandBuffer); } else { camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, afterForwardOpaqueCommandBuffer); } #endif }