Éviter la répétition de textures de terrain layers

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Éviter la répétition de textures de terrain layers

Message par Nemo67 » 25 Jan 2020 18:36

Bonjour tout le monde,

J’ai une question de débutant concernant le « painting » de terrain dans la dernière version d’Unity.

En appliquant nos textures définies dans le Terrain Layers on se retrouve souvent avec de grandes surfaces de textures qui se répètent et ne font pas très « naturelles » notamment vues de haut.

Exemple caricatural du problème:
Image

En augmentant le Tilling Setting en X et Y l’effet est moins prononcé mais on se retrouve au sol avec des textures basse résolution.

- Peut être faut-il changer le shader « Defaut-Terrain-Standart » par un autre qui mélange les textures différemment ?
- Existe-il un asset qui s’occupe de ce problème d’une manière plus efficace ?

Vos conseils sont les bienvenus. Merci d’avance.

hj67
Messages : 13
Inscription : 21 Mars 2018 20:32

Re: Éviter la répétition de textures de terrain layers

Message par hj67 » 25 Jan 2020 19:55

Unity a développé un shader pour ça, il y a aussi l'un ou l'autre shader sur l'asset store.

https://blogs.unity3d.com/2019/02/14/pr ... -in-unity/

++

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Éviter la répétition de textures de terrain layers

Message par Alesk » 25 Jan 2020 20:00

Il n'existe pas de solution "simple" à ce problème, malheureusement.

En mixant deux textures différentes dans le shader (une peu détaillée et couvrant une large surface, avec des couleurs et une autre avec juste des détails, plus petite et en niveaux de gris, le tout en mode multiply), ça aide à atténuer le souci, mais sans le faire disparaitre totalement ...

D'autres pistes ici : https://forum.unity.com/threads/prevent ... es.316014/

http://acegikmo.com/shaderforge/wiki/in ... e_Blending

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Éviter la répétition de textures de terrain layers

Message par Nemo67 » 25 Jan 2020 20:11

Merci pour ces infos.
Je me doutais qu'il faut regarder du côté des shader, reste à tester différentes solutions...

Bonne soirée

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Éviter la répétition de textures de terrain layers

Message par Nemo67 » 27 Jan 2020 20:22

Pour les personnes intéressées par ce souci de répétition de texture sur les terrains voici un lien vers un sujet :

https://forum.unity.com/threads/improve ... ng.116509/

Le dernier post donne un lien vers un shader qui fait bien le boulot...

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Éviter la répétition de textures de terrain layers

Message par djulio74 » 27 Jan 2020 20:34

Nemo67 a écrit :
27 Jan 2020 20:22
Pour les personnes intéressées par ce souci de répétition de texture sur les terrains voici un lien vers un sujet :

https://forum.unity.com/threads/improve ... ng.116509/

Le dernier post donne un lien vers un shader qui fait bien le boulot...
Oui c'est comme pour faire un terrain aléatoire à base de noise, il faut mixer avec des itérations de plus en plus réduite. Il le fait avec une fois la texture réduite de 4x, mais peut être un meilleur rendu encore avec l'ajout de passe de plus en plus petite :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Éviter la répétition de textures de terrain layers

Message par Nemo67 » 27 Jan 2020 20:37

Faut changer ça dans le fichier de shader ?
Tu peux m'expliquer où ça se passe ?

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Éviter la répétition de textures de terrain layers

Message par djulio74 » 27 Jan 2020 20:56

oui ça se fait dans un shader.
Si tu fais un nouveau shader, tu as ça :

Code : Tout sélectionner

Shader "Custom/NewSurfaceShader" {
	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;

		struct Input {
			float2 uv_MainTex;
		};

		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, IN.uv_MainTex) * _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"
}
il y a pas mal de truc , ça ressemble un peu a du C# mais pas tout a fait, ou du moins des structures différentes. ais dans notre cas ce qui nous importe c'est ça :

Code : Tout sélectionner

void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = (tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
et surtout cette ligne :

Code : Tout sélectionner

fixed4 c = (tex2D (_MainTex, IN.uv_MainTex) * _Color;
c'est elle qui viens mixer une couleur avec la texture.

Code : Tout sélectionner

_MainTex
est la texture principal du shader, dans le cas d'un nouveau shader c'est même la seule.

Code : Tout sélectionner

IN.uv_MainTex
C'est un vector2 (float2 dans les shader) qui sont en fait les coordonné UV du pixel ou du vertex. si tu le multiplie par deux par exemple, ta texture se repetera deux fois plus. (IN.uv_MainTex * 2.0)
Le lien que tu as mis en fait il mixe une fois la texture normal, puis une fois la texture 4x plus petite, donc repetée 4 x fois, en faisant la moyenne des deux.

Code : Tout sélectionner

fixed4 c = ( (tex2D (_MainTex, IN.uv_MainTex) + (tex2D (_MainTex, IN.uv_MainTex*4.0)) * 0.5  * _Color;
avec cç tu a une fois la texture normal, avec en plus une foix 4x plus petite et tu multiplie par 0. (au lieu de divisé par 2) pour faire la moyenne .

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Éviter la répétition de textures de terrain layers

Message par Nemo67 » 28 Jan 2020 10:00

Merci djulio pour ces explications !

Répondre

Revenir vers « Unity le logiciel »