protected override bool ProcessNode(CommandBuffer cmd) { // Force the double buffering for multi-pass flooding rtSettings.doubleBuffered = true; if (!base.ProcessNode(cmd) || input == null) { return(false); } UpdateTempRenderTexture(ref output); cmd.SetComputeFloatParam(computeShader, "_Threshold", threshold); cmd.SetComputeVectorParam(computeShader, "_Size", new Vector4(output.width, 1.0f / output.width)); cmd.SetComputeFloatParam(computeShader, "_Distance", distance / 100.0f); cmd.SetComputeIntParam(computeShader, "_ThresholdMode", (int)thresholdMode); cmd.SetComputeIntParam(computeShader, "_DistanceMode", (int)distanceMode); cmd.SetComputeIntParam(computeShader, "_Mode", (int)mode); output.doubleBuffered = true; output.EnsureDoubleBufferConsistency(); var rt = output.GetDoubleBufferRenderTexture(); rt.Release(); rt.enableRandomWrite = true; rt.Create(); MixtureUtils.SetupComputeDimensionKeyword(computeShader, input.dimension); cmd.SetComputeTextureParam(computeShader, fillUvKernel, "_Input", input); cmd.SetComputeTextureParam(computeShader, fillUvKernel, "_Output", output); cmd.SetComputeTextureParam(computeShader, fillUvKernel, "_FinalOutput", rt); cmd.SetComputeIntParam(computeShader, "_DistanceMode", (int)distanceMode); cmd.SetComputeFloatParam(computeShader, "_InputScaleFactor", (float)input.width / (float)output.width); DispatchCompute(cmd, fillUvKernel, output.width, output.height, output.volumeDepth); int maxLevels = (int)Mathf.Log(input.width, 2); for (int i = 0; i <= maxLevels; i++) { float offset = 1 << (maxLevels - i); cmd.SetComputeFloatParam(computeShader, "_InputScaleFactor", 1); cmd.SetComputeFloatParam(computeShader, "_Offset", offset); cmd.SetComputeTextureParam(computeShader, jumpFloodingKernel, "_Input", output); cmd.SetComputeTextureParam(computeShader, jumpFloodingKernel, "_Output", rt); cmd.SetComputeIntParam(computeShader, "_DistanceMode", (int)distanceMode); DispatchCompute(cmd, jumpFloodingKernel, output.width, output.height, output.volumeDepth); cmd.CopyTexture(rt, output); } cmd.SetComputeFloatParam(computeShader, "_InputScaleFactor", (float)input.width / (float)output.width); cmd.SetComputeTextureParam(computeShader, finalPassKernel, "_Input", input); cmd.SetComputeTextureParam(computeShader, finalPassKernel, "_Output", rt); cmd.SetComputeIntParam(computeShader, "_DistanceMode", (int)distanceMode); cmd.SetComputeTextureParam(computeShader, finalPassKernel, "_FinalOutput", output); DispatchCompute(cmd, finalPassKernel, output.width, output.height, output.volumeDepth); return(true); }