Exemplo n.º 1
0
    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);
        }
    }
Exemplo n.º 2
0
    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]);
    }