I have created a mesh procedurally and then I am trying to create a terrain on top of it. I am new to Unity so from what I understand I need to start by applying some texture to do so. In order to do that though I first need to apply the UV to my mesh. What I had in mind is, simply place the texture on top of the mesh but from what I understood I can’t do that and I need to generate per triangle the uv. Doing the above with this code:
Vector2[] uvs_temp = Unwrapping.GeneratePerTriangleUV(mesh);
Vector2[] uvs= new Vector2[vertices.Length];
for(int i=0; i<uvs_temp.Length; i++) {
// Removing duplicates
if(i == 0 || uvs_temp *!= uvs_temp[i-1]) {*
uvs = new Vector2(uvs_temp.x, uvs_temp*.y);
_}
}
mesh.uv = uvs;
Results in the result above which if I understand correctly since I applied to each trianglethe uv, it re-applies the same grass per triangle, but I can’t understand how to fix it.
How can I apply a texture on top of my whole mesh?
[192236-screenshot-1.png*|192236]*
[192235-grassuv02-small.png|192235]
_*
I am also quite new to Unity and I don’t know if this will help, but I know that you can use a shader to apply the texture to your mesh. For example, you could write a standard surface shader that will apply a texture using world coordinates instead. Here is a sample code I wrote for this:
Shader "Custom/TerrainShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
float4 _MainTex_ST;
struct Input
{
float3 worldPos;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, float2(_MainTex_ST.z + _MainTex_ST.x * IN.worldPos.x, _MainTex_ST.w + _MainTex_ST.y * IN.worldPos.z)) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
This Standard Surface Shader applies a repeating texture to a mesh with the x-axis and z-axis. The only issue you might encounter with this is if you move your terrain. If you do so, the texture will stretch. Hopefully this will help.