/// <summary> /// Configure the pass before execution /// </summary> /// <param name="baseDescriptor">Current target descriptor</param> /// <param name="colorAttachmentHandle">Color attachment to render into</param> /// <param name="depthAttachmentHandle">Depth attachment to render into</param> /// <param name="configuration">Specific render configuration</param> public void Setup( RenderTextureDescriptor baseDescriptor, RenderTargetHandle colorAttachmentHandle, RenderTargetHandle depthAttachmentHandle, RendererConfiguration configuration, SampleCount samples) { this._ColorAttachmentHandle = colorAttachmentHandle; this._DepthAttachmentHandle = depthAttachmentHandle; _Descriptor = baseDescriptor; _RendererConfiguration = configuration; if ((int)samples > 1) { baseDescriptor.bindMS = false; baseDescriptor.msaaSamples = (int)samples; } baseDescriptor.colorFormat = RenderTextureFormat.ARGBHalf; baseDescriptor.depthBufferBits = 0; _DescriptorAC = baseDescriptor; baseDescriptor.colorFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RHalf) ? RenderTextureFormat.RHalf : RenderTextureFormat.ARGBHalf; _DescriptorAA = baseDescriptor; _AccumColorHandle.Init("_AccumColor"); _AccumGIHandle.Init("_AccumGI"); _AccumAlphaHandle.Init("_AccumAlpha"); _AccumBinding = new RenderTargetBinding(new RenderTargetIdentifier[] { _AccumColorHandle.Identifier(), _AccumGIHandle.Identifier(), _AccumAlphaHandle.Identifier(), }, new RenderBufferLoadAction[] { RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, }, new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, }, _DepthAttachmentHandle.Identifier(), RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); }
public ScriptableRenderPass GetPassToEnqueue(RenderTextureDescriptor desc, RenderTargetHandle colorHandle, RenderTargetHandle depthHandle) { m_NyanCat.Setup(m_NyanCatTexture, colorHandle.Identifier(), m_Material); return(m_NyanCat); }
/// <summary> /// Configure the pass before execution /// </summary> /// <param name="baseDescriptor">Current target descriptor</param> /// <param name="colorAttachmentHandle">Color attachment to render into</param> /// <param name="depthAttachmentHandle">Depth attachment to render into</param> /// <param name="configuration">Specific render configuration</param> public bool Setup( RenderTextureDescriptor baseDescriptor, RenderTargetHandle colorAttachmentHandle, RenderTargetHandle depthAttachmentHandle, RendererConfiguration configuration, SampleCount samples, RenderingData renderingData) { if (!GetViewDepthMinMaxWithRenderQueue(renderingData.cameraData.camera, RenderQueueUtils.oit, out _ViewDepthMinMax)) { return(false); } this._ColorAttachmentHandle = colorAttachmentHandle; this._DepthAttachmentHandle = depthAttachmentHandle; _RendererConfiguration = configuration; if ((int)samples > 1) { baseDescriptor.bindMS = false; baseDescriptor.msaaSamples = (int)samples; } baseDescriptor.depthBufferBits = 0; _Descriptor = baseDescriptor; _MomentsPrecision = renderingData.cameraData.momentsPrecision; if (_MomentsPrecision == FloatPrecision._Single) { baseDescriptor.colorFormat = RenderTextureFormat.ARGBFloat; _DescriptorFloat4 = baseDescriptor; baseDescriptor.colorFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RGFloat) ? RenderTextureFormat.RGFloat : RenderTextureFormat.ARGBFloat; _DescriptorFloat2 = baseDescriptor; baseDescriptor.colorFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RFloat) ? RenderTextureFormat.RFloat : RenderTextureFormat.ARGBFloat; _DescriptorFloat = baseDescriptor; } else { baseDescriptor.colorFormat = RenderTextureFormat.ARGBHalf; _DescriptorFloat4 = baseDescriptor; baseDescriptor.colorFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RGHalf) ? RenderTextureFormat.RGHalf : RenderTextureFormat.ARGBHalf; _DescriptorFloat2 = baseDescriptor; baseDescriptor.colorFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RHalf) ? RenderTextureFormat.RHalf : RenderTextureFormat.ARGBHalf; _DescriptorFloat = baseDescriptor; } _B0Handle.Init("_B0"); _B1Handle.Init("_B1"); _B2Handle.Init("_B2"); _MomentsCount = (MomentsCount)renderingData.cameraData.momentsCount; if (MomentsCount._4 != _MomentsCount) { _GMBinding = new RenderTargetBinding( new RenderTargetIdentifier[] { _B0Handle.Identifier(), _B1Handle.Identifier(), _B2Handle.Identifier(), }, new RenderBufferLoadAction[] { RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, }, new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, }, _DepthAttachmentHandle.Identifier(), RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); } else { _GMBinding = new RenderTargetBinding( new RenderTargetIdentifier[] { _B0Handle.Identifier(), _B1Handle.Identifier(), }, new RenderBufferLoadAction[] { RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, }, new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, }, _DepthAttachmentHandle.Identifier(), RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); } _MOITHandle.Init("_MOIT"); _GIALHandle.Init("_GIAL"); _RMBinding = new RenderTargetBinding( new RenderTargetIdentifier[] { _MOITHandle.Identifier(), _GIALHandle.Identifier(), }, new RenderBufferLoadAction[] { RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, }, new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, }, _DepthAttachmentHandle.Identifier(), RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare ); return(true); }
/// <inheritdoc/> public override void Execute(ScriptableRenderer renderer, ScriptableRenderContext context, ref RenderingData renderingData) { if (renderer == null) { throw new ArgumentNullException("renderer"); } if (!renderingData.shadowData.supportsDeepShadowMaps) { return; } LightData lightData = renderingData.lightData; int shadowLightIndex = lightData.mainLightIndex; if (shadowLightIndex == -1) { return; } VisibleLight shadowLight = lightData.visibleLights[shadowLightIndex]; ShadowData shadowData = renderingData.shadowData; RenderTargetIdentifier result; CommandBuffer cmd = CommandBufferPool.Get(k_RenderScreenSpaceDeepShadowMaps); using (new ProfilingSample(cmd, k_RenderScreenSpaceDeepShadowMaps)) { #if UNITY_EDITOR var testDescriptor = _Descriptor; testDescriptor.enableRandomWrite = true; testDescriptor.colorFormat = RenderTextureFormat.ARGB32; cmd.GetTemporaryRT(_DeepShadowTest.id, testDescriptor); var _ResetCompute = renderer.GetCompute(ComputeHandle.ResetDeepShadowDataCompute); int KernelTestDeepShadowMap = _ResetCompute.FindKernel("KernelTestDeepShadowMap"); cmd.SetRenderTarget(_DeepShadowTest.Identifier()); cmd.SetComputeBufferParam(_ResetCompute, KernelTestDeepShadowMap, "_CountBuffer", _CountBuffer); cmd.SetComputeBufferParam(_ResetCompute, KernelTestDeepShadowMap, "_DataBuffer", _DataBuffer); cmd.SetComputeTextureParam(_ResetCompute, KernelTestDeepShadowMap, "_TestRt", _DeepShadowTest.Identifier()); cmd.DispatchCompute(_ResetCompute, KernelTestDeepShadowMap, shadowData.deepShadowMapsSize / 8, shadowData.deepShadowMapsSize / 8, 1); context.ExecuteCommandBuffer(cmd); cmd.Clear(); #endif // Resolve Material ssdsm = renderer.GetMaterial(MaterialHandle.ScreenSpaceDeepShadowMaps); ssdsm.SetBuffer(Shader.PropertyToID("_CountBuffer"), _CountBuffer); ssdsm.SetBuffer(Shader.PropertyToID("_DataBuffer"), _DataBuffer); cmd.GetTemporaryRT(_DeepShadowLut.id, _Descriptor); RenderTargetIdentifier lutId = _DeepShadowLut.Identifier(); SetRenderTarget(cmd, lutId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.Color | ClearFlag.Depth, Color.black, _Descriptor.dimension); cmd.Blit(lutId, lutId, ssdsm); result = lutId; // Blur int blurOffset = shadowData.deepShadowMapsBlurOffset; if (blurOffset > 0) { Material pom = renderer.GetMaterial(MaterialHandle.GaussianBlur); cmd.GetTemporaryRT(_DeepShadowTmp.id, _Descriptor); RenderTargetIdentifier src = lutId; RenderTargetIdentifier dst = _DeepShadowTmp.Identifier(); while (blurOffset > 0) { pom.SetFloat("_SampleOffset", blurOffset); SetRenderTarget(cmd, dst, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.Color | ClearFlag.Depth, Color.black, _Descriptor.dimension); cmd.Blit(src, dst, pom); result = dst; dst = src; src = result; blurOffset >>= 1; } } //TODO : for stereo context.ExecuteCommandBuffer(cmd); cmd.Clear(); cmd.SetGlobalTexture(_Destination.id, result); cmd.ReleaseTemporaryRT(_DeepShadowTest.id); } //SetKeyword CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.DeepShadowMaps, true); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); }