Ejemplo n.º 1
0
    private void DoHardIteration()
    {
        int n4 = N / 4;
        int n8 = n4 / 2;

        IterationHard.Dispatch(mIterationHardKernelId, n4, n4, n4);
        Copy.Dispatch(mCopyKernelId, n8, n8, n8);
    }
Ejemplo n.º 2
0
    public IEnumerator InitModel()
    {
        RenTexture = new RenderTexture(N, N, 24, RenderTextureFormat.RFloat)
        {
            enableRandomWrite = true,
            volumeDepth       = N,
            dimension         = UnityEngine.Rendering.TextureDimension.Tex3D,
            filterMode        = FilterMode.Point,
            wrapMode          = TextureWrapMode.Clamp
        };
        RenTexture.Create();

        Buffer = new RenderTexture(N, N, 24, RenderTextureFormat.RFloat)
        {
            enableRandomWrite = true,
            volumeDepth       = N,
            dimension         = UnityEngine.Rendering.TextureDimension.Tex3D,
            filterMode        = FilterMode.Point,
            wrapMode          = TextureWrapMode.Clamp
        };
        Buffer.Create();

        Display = new RenderTexture(N, N, 24, RenderTextureFormat.RFloat)
        {
            enableRandomWrite = true,
            volumeDepth       = N,
            dimension         = UnityEngine.Rendering.TextureDimension.Tex3D,
            filterMode        = FilterMode,
            wrapMode          = TextureWrapMode.Clamp
        };
        Display.Create();


        yield return(new WaitForSeconds(1));


        PlaneMaterial.SetTexture("_MainTex", Display);
        PlaneMaterial.SetFloat("_MaxValue", StartPotential);



        var initKernelId = Init.FindKernel("CSMain");

        Init.SetTexture(initKernelId, "_Result", RenTexture);
        Init.SetFloat("_InitialValue", StartPotential);
        Init.SetFloat("_NodesCount", N);

        mFigures      = mTree.GetComponentsInChildren <Figure>();
        mFiguresCount = mFigures.Length;

        //Init.SetInt("_MaxStep", mMaxSteps);
        //Init.SetFloat("_MaxDist", MaxDistance);
        Init.SetInt("_FiguresCount", mFiguresCount);

        mBuffer = new ComputeBuffer(mFiguresCount, 132);
        var data = mFigures.Select((x) => new ShaderFigure
        {
            Type   = (int)x.Type,
            Matr   = x.transform.worldToLocalMatrix,
            Params = x.Params
        }).ToArray();

        mBuffer.SetData(data);

        Init.SetBuffer(initKernelId, "_Figures", mBuffer);
        var n4 = N / 4;

        Init.Dispatch(initKernelId, n4, n4, n4);
        //buffer.Dispose();

        yield return(new WaitForSeconds(1));


        mIterationKernelId = Iteraition.FindKernel("CSMain");
        Iteraition.SetTexture(mIterationKernelId, "_Source", RenTexture);
        Iteraition.SetTexture(mIterationKernelId, "_Result", Buffer);


        mIterationHardKernelId = IterationHard.FindKernel("CSMain");
        IterationHard.SetTexture(mIterationKernelId, "_Source", RenTexture);
        IterationHard.SetTexture(mIterationKernelId, "_Result", Buffer);
        IterationHard.SetFloat("_InitialValue", StartPotential);
        IterationHard.SetFloat("_NodesCount", N);
        IterationHard.SetInt("_MaxStep", MaxSteps);
        IterationHard.SetFloat("_Dist", 1f / (N - 1));
        //IterationHard.SetFloat("_MaxDist", MaxDistance);
        IterationHard.SetInt("_FiguresCount", mFiguresCount);
        IterationHard.SetBuffer(mIterationHardKernelId, "_Figures", mBuffer);

        mCopyKernelId = Copy.FindKernel("CSMain");
        Copy.SetTexture(mCopyKernelId, "_Source", Buffer);
        Copy.SetTexture(mCopyKernelId, "_Result", RenTexture);
        Copy.SetTexture(mCopyKernelId, "_ResultAbs", Display);


        yield return(new WaitForSeconds(1));

        mCutFigure = Instantiate(mCutPrefab, mTree);
        mCutFigure.SetActive(Cut);
        mCutFigure.GetComponent <Synch>().From = mCutAnchor;

        mPlane.CanShow = true;

        mStart = true;
        yield break;
    }