Exemplo n.º 1
0
        public void SetType(FbmType type)
        {
            switch (type)
            {
            case FbmType.None:
                CurrentTechnique = Techniques["Single"];
                break;

            case FbmType.Normal:
                CurrentTechnique = Techniques["Fbm"];
                break;

            case FbmType.Billowed:
                CurrentTechnique = Techniques["FbmBillow"];
                break;

            case FbmType.Ridged:
                CurrentTechnique = Techniques["FbmRidged"];
                break;

            case FbmType.IQ:
                CurrentTechnique = Techniques["FbmIQ"];
                break;

            case FbmType.Swiss:
                CurrentTechnique = Techniques["FbmSwiss"];
                break;

            case FbmType.Jordan:
                CurrentTechnique = Techniques["FbmJordan"];
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }
        }
        float[] Get3DNoiseValue(int chanel)
        {
            ComputeShader shader;

            switch (_select3DNoise[chanel])
            {
            case Noise3DType.PerlinNoise:
                shader = _perlinNoise3DShader;
                break;

            case Noise3DType.WorleyNoise:
                shader = _worleyNoise3DShader;
                break;

            case Noise3DType.Perlin_WorleyNoise:
                shader = _worleyPerlinNoise3DShader;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            FbmType fbm  = _selectFbm[chanel];
            int     size = 128;

            float[]       noise = new float[size * size * size];
            ComputeBuffer cb1   = new ComputeBuffer(noise.Length, 4);

            cb1.SetData(noise);
            shader.SetFloat("TextureSize", size);
            shader.SetFloat("NoiseScale", 2 * _noiseScale[chanel]);
            if (fbm != FbmType.dontuse)
            {
                SetFbmProperties(shader, chanel);
            }
            int threadGroupsX = Mathf.CeilToInt(size / 8.0f);
            int threadGroupsY = Mathf.CeilToInt(size / 8.0f);
            int threadGroupsZ = Mathf.CeilToInt(size / 8.0f);

            switch (fbm)
            {
            case FbmType.dontuse:
                shader.SetBuffer(0, "Result", cb1);
                shader.Dispatch(0, threadGroupsX, threadGroupsY, threadGroupsZ);
                break;

            case FbmType.standard:
                shader.SetBuffer(1, "Result", cb1);
                shader.Dispatch(1, threadGroupsX, threadGroupsY, threadGroupsZ);
                break;

            case FbmType.turbulence:
                shader.SetBuffer(2, "Result", cb1);
                shader.Dispatch(2, threadGroupsX, threadGroupsY, threadGroupsZ);
                break;

            case FbmType.ridge:
                shader.SetBuffer(3, "Result", cb1);
                shader.Dispatch(3, threadGroupsX, threadGroupsY, threadGroupsZ);
                break;

            default:
                throw new ArgumentOutOfRangeException("fbm", fbm, null);
            }
            cb1.GetData(noise);
            cb1.Release();
            Update3DPerview(size, chanel, noise);
            return(noise);
        }