[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 17 Mai 2017 13:22

boubouk50 a écrit :J'ai pas testé, je l'ai fait à partir de bouts de code que j'ai choppé sur le net. Teste voir s'il fonctionne, enregistre-le en .shader ou bien crée un nouveau shader et supprime tout à l'intérieur pour remplacer le contenu. S'il compile, tu le trouveras dans la liste des shaders sous CustomShader > Unlit Clamp-To-Zero:

Code : Tout sélectionner

Shader "CustomShader/Unlit Clamp-To-Zero" {
	Properties {
		_MainTex ("Base Texture (RGB)", 2D) = "white" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 100
		
		Cull Off
		
		CGPROGRAM
		#pragma surface surf Unlit
		#include "UnityCG.cginc"
		
		 half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten) {
           half4 c;
           c.rgb = s.Albedo;
		   c.a = 1;
           return c;
         }
		
		sampler2D _MainTex;
		
		struct Input {
			float2 uv_MainTex;
		};
		
		void surf(Input IN, inout SurfaceOutput o) {
			fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
			fixed4 c;
			if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0)
				c = fixed4 (0, 0, 0, 0);
			else
				c = tex;
			o.Albedo = c.rgb;
		}
		
		ENDCG
	}
	
	Fallback "Diffuse"
} 
Dis Boubouk, désolé d'encore te solliciter ;)...mais je dois maintenant adapter ce principe sur la map d'émission!!
Aurais-tu un peu de temps pour me montrer ce que cela donnerait en "adaptant" ce traitement de la map à l'émission cette fois!?

Merci!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 17 Mai 2017 13:27

Avant cela, dis moi ce dont tu as besoin. Je veux dire le rendu final. Que ce soit émissif pour de la GI?
Ici, normalement, le shader est Unlit (je l'ai fait à la volée, alors je suis as sur non plus) donc l'éclairage n'est pas pris en compte. Il est émissif car il est rendu telle la texture sans surcouche de lumière. Si ce n'est pas ce que tu veux, alors explique-moi stp.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 17 Mai 2017 13:37

Oui, oui...(et merci pour ta réponse)..il s'agit bien cette fois d'intégrer ce principe à l'émission (emissive map) pour pour la GI!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 17 Mai 2017 13:52

Là, c'est un poil plus compliqué alors. Je ne sais pas quels types de shader émissif sont utilisés pour la GI.
A essayer:

Code : Tout sélectionner

Shader "CustomShader/Emissive Clamp-To-Zero" {
   Properties {
     _EmissionMap ("Emission Map", 2D) = "white" {}
   }
   
   SubShader {
      Tags { "RenderType"="Opaque" }
      LOD 100
      
      Cull Off
      
      CGPROGRAM
      #pragma surface surf Emissive
      #include "UnityCG.cginc"
      
       half4 LightingEmissive (SurfaceOutput s, half3 lightDir, half atten) {
           half4 c;
           c.rgb = s.Albedo + s.Emission;
           c.a = 1;
           return c;
         }
      
      sampler2D _EmissionMap;
      
      struct Input {
         float2 uv_EmissionMap;
      };
      
      void surf(Input IN, inout SurfaceOutput o) {
         half4 tex = tex2D(_EmissionMap, IN.uv_EmissionMap);
         half4 c;
         if (IN.uv_EmissionMap.x > 1.0 || IN.uv_EmissionMap.x < 0.0 || IN.uv_EmissionMap.y > 1.0 || IN.uv_EmissionMap.y < 0.0)
            c = half4 (0, 0, 0, 0);
         else
            c = tex;
         o.Emission = c.rgb;
         o.Albedo = fixed4 (0, 0, 0, 0);
      }
      
      ENDCG
   }
   
   Fallback "Diffuse"
} 
J'ai utilisé le canal emissif pour faire la même chose. En espérant qu'il soit pris en compte pour la GI. Sinon, peut-être faudrait-il passer par les SurfaceOutputStandard.
https://docs.unity3d.com/Manual/SL-Surf ... mples.html
C'est pas évident de le faire sans tester... :gene:
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 17 Mai 2017 18:51

Super, une fois de plus tu as assuré, cela marche très bien!
J'ai d'abord cru qu'il y avait un problème, car comme il y a un bord noir en dessous de l'image, je ne m'attendais pas à ce que l'illumination commence au pied de "l'écran" carré...mais un peu plus loin!
Voila ce que ca donne (A), voila ce que j'imaginais (B)

Image

Alors, je ne sais pas ce qui est correct d'un point de vue physique? Est-ce l'image A ou l'image B?...mais par contre, je sais que ca n'a pas de rapport avec notre façon de faire (le code et le shader) car un mapping 'normal' d'une texture qui comporte d'origine des bords noirs donne le même résultat!
En voici d'ailleurs une illustration qui montre qu'il y a de l'illumination au pied d'une texture avec bande noir...mais que cette illumination s'intensifie si je déplace l'offset (U)V pour me rapprocher du sol..ca a donc l'air plus ou moins correct!?

Image
Dernière édition par Jayme65 le 17 Mai 2017 21:42, édité 1 fois.

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 17 Mai 2017 21:42

Merci encore pour ton aide! :)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 18 Mai 2017 09:57

Attend un peu, je m'auto-congratule: :amen:

Physiquement c'est normal. Le rayonnement est omnidirectionnel, c'est à dire qu'il va dans toutes les directions. Donc il va jusqu'au pied du plan. Cette partie sera éclairée mais moins intensément de part l'angle et la distance de rayonnement. C'est pour cela que plus le plan se rapproche du sol, plus il éclaire.

Si ce problème est entièrement résolu, édite le titre du premier post en ajoutant [RESOLU] en début de celui-ci afin de signaler aux autres membres que la solution est trouvée. Merci.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 18 Mai 2017 19:07

Tout marchait très bien sur ma scène de test (celle utilisée dans ce post), je copie donc le shader dans ma scène de travail...et là, plus d'illumination!!
J'ai cherché pendant des heures quelle pouvait être la rasion..jusqu'à ce que je tombe sur https://docs.unity3d.com/ScriptReferenc ... Flags.html

Là, je rajoute dans le code un:

Code : Tout sélectionner

leNomDuMateriel.globalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
...et l'illumination apparaît!

Question! ;) :

1 - Pourquoi l'émission est elle visible dans une scène...et nécessite dans une autre, d'assigner au material un flag "MaterialGlobalIlluminationFlags.RealtimeEmissive" ?

2 - Comment se fait-il qu'une fois que cela a été fait une fois (donc, une fois que le programme a tourné avec cette ligne de code)...je peux ensuite retirer cette ligne et maintenant, à chaque re-lancement du programme l'illumination est désormais visible!!??

3 - Ne peut-on pas fixer ce 'Realtime emissive' directement dans le shader?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 19 Mai 2017 09:17

Comemnt l'as-tu copier-collé? As-tu également copier-collé le fichier .meta?
Le .meta contient les propriétés de ton fichier, dont RealtimeGI en fait partie. Si tu ne le copies pas, alors les propriétés sont remises à zéro et ce flag peut donc disparaître (1).
Les changements de propriétés directement sur le matériau (et non pas l'instance) en script restent en place après runtime. C'est pour cela que le script pour lui coller la propriété n'est utile qu'une seule fois (2).
C’est une propriété du matériau, pas du shader, donc tu ne peux pas le fixer dans le shader (3). Par contre, cette propriété doit être accessible depuis l'éditeur je pense, dans le matériau.
Pour les standradmaterials, je pense que c'est le dropDownList GloablIllumin sous l'emissive:
Image
Est-ce accessible depuis les matériaux avec des shaders customs... je ne sais point.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 18 Nov 2017 19:47

boubouk50 a écrit :
21 Avr 2017 13:02
J'ai pas testé, je l'ai fait à partir de bouts de code que j'ai choppé sur le net. Teste voir s'il fonctionne, enregistre-le en .shader ou bien crée un nouveau shader et supprime tout à l'intérieur pour remplacer le contenu. S'il compile, tu le trouveras dans la liste des shaders sous CustomShader > Unlit Clamp-To-Zero:

Code : Tout sélectionner

Shader "CustomShader/Unlit Clamp-To-Zero" {
	Properties {
		_MainTex ("Base Texture (RGB)", 2D) = "white" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 100
		
		Cull Off
		
		CGPROGRAM
		#pragma surface surf Unlit
		#include "UnityCG.cginc"
		
		 half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten) {
           half4 c;
           c.rgb = s.Albedo;
		   c.a = 1;
           return c;
         }
		
		sampler2D _MainTex;
		
		struct Input {
			float2 uv_MainTex;
		};
		
		void surf(Input IN, inout SurfaceOutput o) {
			fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
			fixed4 c;
			if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0)
				c = fixed4 (0, 0, 0, 0);
			else
				c = tex;
			o.Albedo = c.rgb;
		}
		
		ENDCG
	}
	
	Fallback "Diffuse"
} 
Je reviens à la charge sur ce shader car cette fois il ne doit plus afficher une couleur noir pour tout ce qui est "clampé"..mais de la transparence!

En ajoutant au shader

Code : Tout sélectionner

SubShader {
     Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
     ZWrite Off
    Lighting Off 
    Blend SrcAlpha OneMinusSrcAlpha
    LOD 100
et

Code : Tout sélectionner

#pragma surface surf Lambert alpha
...j'ai tout de suite eu le comportement attendu (donc de la transparence) sur le RenderTexture qui affichait la vidéo! Par contre, quand il s'agit d'une texture "normale" non seulement cela ne le fait pas, mais l'effet que nous avions jusqu'alors - et pour lequel tu m'avais aidé, à savoir remplacer par des pixels noir quand "hors UV" - disparaît!
Peux-u m'aider à y voir plus clair stp?
La question est donc la même: comment remplacer les pixels qui se répètent en bordure par du transparent?

Image
A gauche, ce que j'ai...à droite, ce que je voudrais

Répondre

Revenir vers « Unity le logiciel »