Créer un shader de terrain personnalisé dans Unity

Dans ce tutoriel, nous allons créer un shader de terrain personnalisé dans Unity pour donner à votre terrain des textures et un éclairage plus réalistes. Cette approche permet de meilleures performances et un meilleur contrôle de la façon dont le terrain interagit avec les lumières, les ombres et d'autres effets environnementaux. Nous aborderons la configuration du shader, son utilisation avec le système de terrain d'Unity et les ajustements à effectuer pour des performances optimales.

1. Mise en place du terrain

Avant de plonger dans la création du shader, configurons d'abord le terrain dans Unity:

  1. Dans Unity, allez dans le menu GameObject et sélectionnez Objet 3D > Terrain.
  2. Cela ajoutera un nouvel objet Terrain à votre scène. Vous pouvez ajuster sa taille, sa hauteur et d'autres paramètres dans l'inspecteur de terrain.
  3. Une fois le terrain créé, vous pouvez peindre dessus à l'aide de l'outil Peinture de texture dans l'inspecteur. Mais pour l'instant, laissez-le vide car nous allons appliquer un shader personnalisé.

2. Création du Terrain Shader

Créons maintenant le shader de terrain personnalisé. Suivez ces étapes:

  1. Faites un clic droit dans la fenêtre Projet et choisissez Créer > Shader > Shader de surface standard.
  2. Nommez le shader CustomTerrainShader et ouvrez-le dans votre éditeur de code préféré.

Remplacez le code du shader par défaut par ce qui suit:

Shader "Custom/TerrainShader"
{
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
        _Specular ("Specular", Color) = (0.2, 0.2, 0.2, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Specular;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldNormal;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
            o.Specular = _Specular;
            o.Smoothness = 0.5;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

3. Application du shader au terrain

Après avoir créé le shader, vous devez l'appliquer au matériau du terrain:

  • Cliquez avec le bouton droit de la souris dans la fenêtre Projet et sélectionnez Créer > Matériau. Nommez ce matériau TerrainMaterial.
  • Dans l'inspecteur de matériaux, cliquez sur la liste déroulante Shader et choisissez Personnalisé > TerrainShader.
  • Attribuer des textures pour MainTex et BumpMap dans l'inspecteur de matériaux.
  • Maintenant, attribuez ce matériau à votre terrain en sélectionnant l'objet Terrain, en allant dans l'Terrain Inspector et en définissant le TerrainMaterial sous la section Materials.

4. Ajuster le shader pour plus de performances

Pour garantir le bon fonctionnement du shader, en particulier sur les grands terrains, nous pouvons modifier quelques paramètres:

  • Réduisez la résolution de la carte normale ou utilisez-en une simplifiée pour réduire la charge du GPU.
  • Désactivez toutes les fonctionnalités du shader que vous n'utilisez pas (comme le mappage de parallaxe ou les effets d'éclairage supplémentaires).
  • Utilisez le système Terrain LOD intégré d'Unity pour ajuster dynamiquement le niveau de détail sur les parties éloignées du terrain.

5. Réglages finaux et tests

Une fois le shader appliqué et le terrain configuré, testez-le dans différentes conditions d'éclairage. Vous pouvez ajuster les propriétés Specular et Smoothness du shader pour voir comment elles affectent l'aspect général de votre terrain dans différents environnements.

Conclusion

Avec un shader de terrain personnalisé, vous pouvez améliorer la fidélité visuelle de vos terrains tout en gardant le contrôle des performances. N'hésitez pas à étendre ce shader en ajoutant des fonctionnalités supplémentaires telles que des textures détaillées, un mappage triplanaire ou une tessellation.