void CreatePositionMap()
        {
            if (_hasCreatedWorldPositionAndNormalAndUVMap == true)
            {
                return;
            }

            FBOUtility.CreateBuffer(ref _worldPositionMap, BufferWidth, BufferHeight, RenderTextureFormat.ARGBFloat, FilterMode.Bilinear);

            if (_script.StageGo != null)
            {
                var mesh = _script.StageGo.transform.GetComponent <MeshFilter>().sharedMesh;

                FBOUtility.ClearBuffer(_worldPositionMap);
                FBOUtility.ClearBuffer(_uvMap);
                FBOUtility.ClearBuffer(_normalMap);

                for (var sm = 0; sm < mesh.subMeshCount; sm++)
                {
                    var vertices = mesh.vertices;
                    var uvs      = mesh.uv;
                    var normals  = mesh.normals;
                    var indices  = mesh.GetIndices(sm);

                    for (var i = 0; i < indices.Length; i += 3)
                    {
                        var idx0 = indices[i + 0];
                        var idx1 = indices[i + 1];
                        var idx2 = indices[i + 2];

                        _setTriangleDataMat.SetVector("_UV0", new Vector3(uvs[idx0].x, uvs[idx0].y, 0.0f));
                        _setTriangleDataMat.SetVector("_UV1", new Vector3(uvs[idx1].x, uvs[idx1].y, 0.0f));
                        _setTriangleDataMat.SetVector("_UV2", new Vector3(uvs[idx2].x, uvs[idx2].y, 0.0f));

                        // --- Position ---
                        // flip x and z
                        _setTriangleDataMat.SetVector("_Color0", new Vector4(vertices[idx0].z, vertices[idx0].y, vertices[idx0].x, 1.0f));
                        _setTriangleDataMat.SetVector("_Color1", new Vector4(vertices[idx1].z, vertices[idx1].y, vertices[idx1].x, 1.0f));
                        _setTriangleDataMat.SetVector("_Color2", new Vector4(vertices[idx2].z, vertices[idx2].y, vertices[idx2].x, 1.0f));
                        Graphics.Blit(null, _worldPositionMap, _setTriangleDataMat, 0);

                        // --- UV ---
                        _setTriangleDataMat.SetVector("_Color0", new Vector4(uvs[idx0].x, uvs[idx0].y, 0.0f, 1.0f));
                        _setTriangleDataMat.SetVector("_Color1", new Vector4(uvs[idx1].x, uvs[idx1].y, 0.0f, 1.0f));
                        _setTriangleDataMat.SetVector("_Color2", new Vector4(uvs[idx2].x, uvs[idx2].y, 0.0f, 1.0f));
                        Graphics.Blit(null, _uvMap, _setTriangleDataMat, 0);

                        // --- Normal ---
                        _setTriangleDataMat.SetVector("_Color0", new Vector4(normals[idx0].x, normals[idx0].y, normals[idx0].z, 1.0f));
                        _setTriangleDataMat.SetVector("_Color1", new Vector4(normals[idx1].x, normals[idx1].y, normals[idx1].z, 1.0f));
                        _setTriangleDataMat.SetVector("_Color2", new Vector4(normals[idx2].x, normals[idx2].y, normals[idx2].z, 1.0f));
                        Graphics.Blit(null, _normalMap, _setTriangleDataMat, 0);
                    }
                }

                Graphics.Blit(_worldPositionMap, _worldPositionYGradientMap, _calcGradientMat, 0);

                _hasCreatedWorldPositionAndNormalAndUVMap = true;
            }
        }