- Home /
 
Color not appearing on created mesh? (only grey)
Hi,
The color on a dynamically created mesh does not show up, the mesh stays grey. The triangles appear well on the mesh, the Regenerate button works also, but still no color on the mesh. I put the texture in a "Textures" folder, or in "Resources", I changed the vertices to get a 2*2 square, I changed the resolution of each tile, the logs appear well. Sometimes the mesh is black after "regenerate", and saving the project makes it appear grey... I restarted Unity in case it was a bug, but it is still the same. The material for the mesh is Diffuse. Would you know how to debug this?
Here is the code if this can help:
the "Regenerate" button :
 using UnityEditor;
 using UnityEngine;
 using System.Collections;
 
 [CustomEditor(typeof(TileMapNe))]
 public class TileMapInspector : Editor {
     
     public override void OnInspectorGUI() {
         //base.OnInspectorGUI();
         DrawDefaultInspector();
         
         if(GUILayout.Button("Regenerate")) {
             TileMapNe tileMap = (TileMapNe)target;
             tileMap.BuildMesh();
         }
     }
 }
 
 
               The code to create the mesh :
 using UnityEngine;
 using System.Collections;
 
 [ExecuteInEditMode]
 [RequireComponent(typeof(MeshFilter))]
 [RequireComponent(typeof(MeshRenderer))]
 [RequireComponent(typeof(MeshCollider))]
 public class TileMapNe : MonoBehaviour {
     
     public int size_x = 2;
     public int size_z = 2;
     public float tileSize = 15.0f;
     
     public Texture2D terrainTiles;
     public int tileResolution;
     
     
     void Start () {
         BuildMesh();
     }
     
     void BuildTexture() {
         
         int texWidth = size_x * tileResolution;
         int texHeight = size_z * tileResolution;
         Texture2D texture = new Texture2D(texWidth, texHeight);
         
         for(int y=0; y < size_z; y++) {
             for(int x=0; x < size_x; x++) {
                 Color p = new Color(1.0f, 0, 0);
                 texture.SetPixel(x, y, p);
             }
         }
         
         texture.filterMode = FilterMode.Point;
         texture.wrapMode = TextureWrapMode.Clamp;
         texture.Apply();
         
         MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
         mesh_renderer.sharedMaterials[0].mainTexture = texture;
         
         Debug.Log ("Done Texture!");
     }
     
     public void BuildMesh() {
         int numTiles = size_x * size_z;
         int numTris = numTiles * 2;
         
         int vsize_x = size_x + 1;
         int vsize_z = size_z + 1;
         int numVerts = vsize_x * vsize_z;
         
         // Generate the mesh data
         Vector3[] vertices = new Vector3[ numVerts ];
         Vector3[] normals = new Vector3[numVerts];
         Vector2[] uv = new Vector2[numVerts];
         
         int[] triangles = new int[ numTris * 3 ];
 
         int x, z;
         for(z=0; z < vsize_z; z++) {
             for(x=0; x < vsize_x; x++) {
                 vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, 0, -z*tileSize );
                 normals[ z * vsize_x + x ] = Vector3.up;
                 uv[ z * vsize_x + x ] = new Vector2( (float)x / size_x, 1f - (float)z / size_z );
             }
         }
         Debug.Log ("Done Verts!");
         
         for(z=0; z < size_z; z++) {
             for(x=0; x < size_x; x++) {
                 int squareIndex = z * size_x + x;
                 int triOffset = squareIndex * 6;
                 triangles[triOffset + 0] = z * vsize_x + x +            0;
                 triangles[triOffset + 1] = z * vsize_x + x + vsize_x + 1;
                 triangles[triOffset + 2] = z * vsize_x + x + vsize_x + 0;
                 
                 triangles[triOffset + 3] = z * vsize_x + x +            0;
                 triangles[triOffset + 4] = z * vsize_x + x +            1;
                 triangles[triOffset + 5] = z * vsize_x + x + vsize_x + 1;
             }
         }
         
         Debug.Log ("Done Triangles!");
         
         // Create a new Mesh and populate with the data
         Mesh mesh = new Mesh();
         mesh.vertices = vertices;
         mesh.triangles = triangles;
         mesh.normals = normals;
         mesh.uv = uv;
         
         // Assign our mesh to our filter/renderer/collider
         MeshFilter mesh_filter = GetComponent<MeshFilter>();
         MeshCollider mesh_collider = GetComponent<MeshCollider>();
         
         mesh_filter.mesh = mesh;
         mesh_collider.sharedMesh = mesh;
         Debug.Log ("Done Mesh!");
         
         BuildTexture();
     }
     
 }
 
               Thanks
Answer by sooncat · Nov 26, 2013 at 10:57 AM
try this
     void BuildTexture()
     {
         //Note1: tielResolution != 0
         int texWidth = size_x * (tileResolution<=0? 1 : tileResolution));
         int texHeight = size_z * (tileResolution<=0? 1 : tileResolution));
         Texture2D texture = new Texture2D(texWidth, texHeight);
 
         //Note2: SetPixs is more efficient than for(SetPix)
         Color[] color = new Color[texWidth * texHeight];
         for(int i=0;i<color.Length;i++)
         {
             color[i] = Color.red;
         }
         texture.SetPixels(color);
 
 
         texture.filterMode = FilterMode.Point;
         texture.wrapMode = TextureWrapMode.Clamp;
         texture.Apply();
 
         MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
         
         //Note3: add material to mesh
         mesh_renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
         mesh_renderer.sharedMaterial.mainTexture = texture;
 
         Debug.Log("Done Texture!");
     }
 
              @sooncat very very nice, thank you. I have got this problem : in the original project (at the bottom of this page: http://quill18.com/unity_tutorials/) the code works fine with his code, but when I repeat it with another gameObject in the same project, I need your changes to make it works, otherwise i get a created mesh entirely black. Then, on a second project, none of them work, your code works though with a red color, but not when I add a texture with : Color[] p = terrainTiles.GetPixels( x*tileResolution , y*tileResolution, tileResolution, tileResolution ); texture.SetPixels(x*tileResolution, y*tileResolution, tileResolution, tileResolution, p); 
the created mesh is always black... Would you know what could be the problem?
@sooncat O$$anonymous$$, I don't know what was the problem. Now on a all-new project, it works fine. Anyway, thanks for your answer, at least I learned something with your message :) EDIT: O$$anonymous$$... I understood: the size of my texture was 512 * 256, and I set too many tiles, with a too high resolution, which added a black texture on the tiles! O$$anonymous$$, done! Thank you again for your help!
Answer by Lantix · May 26, 2014 at 11:12 PM
This is probably too late, but to fix the issue with that tutorial you just need to add the shader either through the editor or in code as sooncat suggested:
 // Between the 2 lines, before trying to set the mainTexture of the material, you need to give the gameObject a material
 MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
 mesh_renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
 mesh_renderer.sharedMaterials[0].mainTexture = texture;
 
              Your answer