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; } }