Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Question Wave Shader - vertices movement along y-Axis not working properly

Discussion in 'Shader Graph' started by vuminhle1997, Jun 14, 2021.

  1. vuminhle1997

    vuminhle1997

    Joined:
    Apr 9, 2021
    Posts:
    3
    Hi,
    I've got an issue to simulate a wave shading movement to a self generated mesh object. I took the wave shader graph from a tutorial here:

    Normally, the mesh looks like this. (see 1. attached file, a simple plane). But when I attach the mesh material with the wave shader to the game object, the vertices in the mesh won't move vertically in the y-Axis (2nd image). All vertices of the generated mesh don't move independently. Insteat, all are moving along the y-Axis with the same value.

    In comparison, I downloaded the plane mesh from the instructor, and wave movement works (3rd image). The instructor made the mesh with Blender. I've compared both, both are just simple planes.
    Here is additionally the shader graph (4th image).

    Code (CSharp):
    1.  
    2.     [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
    3.     public class PlaneMeshGenerator: MonoBehaviour
    4.     {
    5.         private MeshFilter meshFilter;
    6.         private MeshRenderer meshRender;
    7.         private float time;
    8.  
    9.         private void Awake()
    10.         {
    11.             meshFilter = GetComponent<MeshFilter>();
    12.             meshRender = GetComponent<MeshRenderer>();
    13.         }
    14.  
    15.         private void Start()
    16.         {
    17.             var plane = new Plane(100, 100);
    18.             var mesh = plane.GetMesh();
    19.  
    20.             meshFilter.mesh = mesh;
    21.             MakeBackfaceVisible();
    22.             transform.localScale = new Vector3(.3f, 1, .3f);
    23.         }
    24.        
    25.        
    26.         /// <summary>
    27.         /// Solution: http://answers.unity.com/answers/723483/view.html
    28.         /// Makes the backface of this mesh visible!
    29.         /// </summary>
    30.         private void MakeBackfaceVisible()
    31.         {
    32.             var mesh = meshFilter.mesh;
    33.             var vertices = mesh.vertices;
    34.             var verticesLength = vertices.Length;
    35.             var newVerts = new Vector3[verticesLength * 2];
    36.             for (var j = 0; j < verticesLength; j++){
    37.                 // duplicate vertices and uvs:
    38.                 newVerts[j] = newVerts[j+verticesLength] = vertices[j];
    39.             }
    40.             var triangles = mesh.triangles;
    41.             var trianglesLength = triangles.Length;
    42.             var newTris = new int[trianglesLength * 2]; // double the triangles
    43.             for (var i=0; i < trianglesLength; i+=3){
    44.                 // copy the original triangle
    45.                 newTris[i] = triangles[i];
    46.                 newTris[i+1] = triangles[i+1];
    47.                 newTris[i+2] = triangles[i+2];
    48.                 // save the new reversed triangle
    49.                 var j = i+trianglesLength;
    50.                 newTris[j] = triangles[i]+verticesLength;
    51.                 newTris[j+2] = triangles[i+1]+verticesLength;
    52.                 newTris[j+1] = triangles[i+2]+verticesLength;
    53.             }
    54.             mesh.vertices = newVerts;
    55.             mesh.triangles = newTris; // assign triangles last!
    56.         }
    57.     }
    58.  
    Code (CSharp):
    1.  
    2.     public class Plane
    3.     {
    4.         private List<int> triangles;
    5.         private List<Vector3> vertices;
    6.         private List<Vector3[]> segmentsList;
    7.  
    8.         private int xDir;
    9.         private int zDir;
    10.  
    11.         private Mesh mesh;
    12.  
    13.         public Plane(int xDir, int zDir)
    14.         {
    15.             this.xDir = xDir;
    16.             this.zDir = zDir;
    17.             mesh = new Mesh();
    18.            
    19.             GenerateVertices();
    20.             GenerateTriangles();
    21.             GenerateMeshData();
    22.         }
    23.  
    24.         #region Initializer
    25.  
    26.         /// <summary>
    27.         /// Generates vertices for this mesh
    28.         /// </summary>
    29.         private void GenerateVertices()
    30.         {
    31.             vertices = new List<Vector3>();
    32.             segmentsList = new List<Vector3[]>();
    33.  
    34.             for (var x = 0; x < xDir; x++)
    35.             {
    36.                 var verticesOfSegment = new Vector3[zDir];
    37.                 for (var z = 0; z < zDir; z++)
    38.                 {
    39.                     var fraction = (z / (float) zDir);
    40.                     var _x = x;
    41.                     var _y = 0;
    42.                     var _z = z;
    43.  
    44.                     var vertex = new Vector3(_x, _y, _z);
    45.  
    46.                     verticesOfSegment[z] = vertex;
    47.                     vertices.Add(vertex);
    48.                 }
    49.                 segmentsList.Add(verticesOfSegment);
    50.             }
    51.         }
    52.  
    53.         /// <summary>
    54.         /// Generates triangle indices for this mesh
    55.         /// </summary>
    56.         private void GenerateTriangles()
    57.         {
    58.             triangles = new List<int>();
    59.             var tempArray = vertices.ToArray();
    60.             for (var x = 0; x < xDir-1; x++)
    61.             {
    62.                 var next = (x + 1) % xDir;
    63.                 var currArea = segmentsList[x];
    64.                 var nextArea = segmentsList[next];
    65.                 for (var z = 0; z < zDir-1; z++)
    66.                 {
    67.                     var offset = (z + 1) % currArea.Length;
    68.                     var v1 = currArea[z];
    69.                     var v2 = currArea[offset];
    70.                     var v3 = nextArea[z];
    71.                     var v4 = nextArea[offset];
    72.  
    73.                     var i1 = Array.IndexOf(tempArray, v1);
    74.                     var i2 = Array.IndexOf(tempArray, v2);
    75.                     var i3 = Array.IndexOf(tempArray, v3);
    76.                     var i4 = Array.IndexOf(tempArray, v4);
    77.                    
    78.                     // draws first triangle (v1-v2-v3)
    79.                     triangles.Add(i4);
    80.                     triangles.Add(i3);
    81.                     triangles.Add(i1);
    82.                    
    83.                     triangles.Add(i2);
    84.                     triangles.Add(i4);
    85.                     triangles.Add(i1);
    86.                 }
    87.             }
    88.         }
    89.  
    90.         /// <summary>
    91.         /// Generates mesh data by attaching the vertices and triangles to mesh
    92.         /// </summary>
    93.         private void GenerateMeshData()
    94.         {
    95.             mesh.vertices = vertices.ToArray();
    96.             mesh.triangles = triangles.ToArray();
    97.            
    98.             mesh.RecalculateBounds();
    99.             mesh.RecalculateNormals();
    100.             mesh.RecalculateTangents();
    101.             mesh.Optimize();
    102.         }
    103.  
    104.         #endregion
    105.  
    106.         #region Getters
    107.  
    108.         /// <summary>
    109.         /// Returns mesh
    110.         /// </summary>
    111.         /// <returns></returns>
    112.         public Mesh GetMesh()
    113.         {
    114.             return mesh;
    115.         }
    116.  
    117.         #endregion
    118.     }
     

    Attached Files:

  2. vuminhle1997

    vuminhle1997

    Joined:
    Apr 9, 2021
    Posts:
    3
    Ok, you don't need to response. Already resolved!
     
  3. Antypodish

    Antypodish

    Joined:
    Apr 29, 2014
    Posts:
    10,753
    Thats nice.
    But could you provide a solution for future readers?
     
  4. vuminhle1997

    vuminhle1997

    Joined:
    Apr 9, 2021
    Posts:
    3
    Yes, you need to attach an UV-property to the generated mesh.
    Here a quick source code:

    Code (CSharp):
    1. var uvs = new List<Vector2>();
    2. ...
    3. // for each created vertex with x,y,z
    4. var uv = new Vector(x,y);
    5. uvs.Add(uv);
    6. ...
    7. mesh.uv = uvs.ToArray();
     
    Antypodish likes this.