void Compute() { material.color = defaultColor; Graphics.Blit(a, b, material); if (blitInner) { material.color = innerColor; GraphicUtil.BlitExceptBorder(a, b, material); } if (blitBorder) { material.color = borderColor; GraphicUtil.BlitBorder(a, b, material); } }
public void SolvePoisson( RenderTexture x, RenderTexture b, int iterations, float alpha, float beta, System.Action <RenderTexture, RenderTexture> applyBoundaryCondition = null) { var buffers = new RenderTexture[] { RenderTexture.GetTemporary(x.width, x.height, 0, RenderTextureFormat.ARGBFloat), RenderTexture.GetTemporary(x.width, x.height, 0, RenderTextureFormat.ARGBFloat) }; solverMat.SetFloat("_Alpha", alpha); solverMat.SetFloat("_ReciprocalBeta", 1.0f / beta); solverMat.SetTexture("_BTex", b); Graphics.SetRenderTarget(buffers[0]); GL.Clear(true, true, Color.black); Graphics.SetRenderTarget(null); int index = 0; for (int i = 0; i != iterations; ++i) { if (applyBoundaryCondition != null) { applyBoundaryCondition(buffers[index % 2], buffers[(index + 1) % 2]); index++; } GraphicUtil.BlitExceptBorder(buffers[index % 2], buffers[(index + 1) % 2], solverMat); ++index; } Graphics.Blit(buffers[index % 2], x); RenderTexture.ReleaseTemporary(buffers[0]); RenderTexture.ReleaseTemporary(buffers[1]); }