Echo

Questions à propos du scripting Shader.
mrzepo59
Messages : 8
Inscription : 09 Juil 2014 16:20

Echo

Message par mrzepo59 » 09 Juil 2014 16:25

Bonjour,

Dans un mes jeux j'utilise le shader ainsi que le script donné sur cette page :
http://www.seethroughskin.com/blog/echo ... multiples/

Cependant le code donné est écrit de façon à avoir 3 ondes. J'essaie de modifier le shader pour en avoir plus mais je n'y arrive pas.

Voici ce que j'ai essayé de faire :

Code : Tout sélectionner

// Custom surfacer that mimics an echo effect
		void surf (Input IN, inout SurfaceOutput o) {
			float c1;

			// manually add more echos here.
			c1 = ApplyFade(IN,_Position0,_Radius0,_Fade0,_MaxFade0,_MaxRadius0);
			float c3 =c1 + ApplyFade(IN,_Position1,_Radius1,_Fade1,_MaxFade1,_MaxRadius1);
			float c4 = c3 + ApplyFade(IN,_Position2,_Radius2,_Fade2,_MaxFade2,_MaxRadius2);
			float c5 = c4 + ApplyFade(IN,_Position3,_Radius3,_Fade3,_MaxFade3,_MaxRadius3);
			float c6 = c5 + ApplyFade(IN,_Position4,_Radius4,_Fade4,_MaxFade4,_MaxRadius4);
			float c7 = c6 + ApplyFade(IN,_Position5,_Radius5,_Fade5,_MaxFade5,_MaxRadius5);
			c7=c7/8.0;
			
			float c2 = 1.0 - c7;
			o.Albedo = _MainColor.rgb * c2 + tex2D (_MainTex, IN.uv_MainTex).rgb * c7 ;		
		}
Cependant ça ne fonctionne pas. Quelqu'un pourrait me dire où est-ce que je me trompe svp ?

Merci d'avance

mrzepo59
Messages : 8
Inscription : 09 Juil 2014 16:20

Re: Echo

Message par mrzepo59 » 10 Juil 2014 10:36

Une petite précision :

Voici le code complet du changement réalisé sur le shader pour avoir 8 ondes :

Code : Tout sélectionner

Shader "Custom/Echo/MultipleUsingProperty" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_EchoTex ("Echo (RGBA)", 2D) = "white" {}
		_MainColor ("Main Color",Color) = (1.0,1.0,1.0,1.0)
			
		_DistanceFade("Distance Fade",float) = 1.0	

		
		_MaxRadius0("MaxRadius0",float) = 1.0
		_MaxRadius1("MaxRadius0",float) = 1.0
		_MaxRadius2("MaxRadius0",float) = 1.0
		_MaxRadius3("MaxRadius0",float) = 1.0
		_MaxRadius4("MaxRadius0",float) = 1.0
		_MaxRadius5("MaxRadius0",float) = 1.0

		
		_MaxFade0("MaxFade0",float) = 1.0
		_MaxFade1("MaxFade1",float) = 1.0
		_MaxFade2("MaxFade2",float) = 1.0
		_MaxFade3("MaxFade3",float) = 1.0
		_MaxFade4("MaxFade4",float) = 1.0
		_MaxFade5("MaxFade5",float) = 1.0
		_MaxFade6("MaxFade6",float) = 1.0
		_MaxFade7("MaxFade7",float) = 1.0
		
		_Position0("Position0",Vector) = (0.0,0.0,0.0)
		_Position1("Position1",Vector) = (0.0,0.0,0.0)
		_Position2("Position2",Vector) = (0.0,0.0,0.0)
		_Position3("Position3",Vector) = (0.0,0.0,0.0)
		_Position4("Position4",Vector) = (0.0,0.0,0.0)
		_Position5("Position5",Vector) = (0.0,0.0,0.0)
		_Position6("Position6",Vector) = (0.0,0.0,0.0)
		_Position7("Position7",Vector) = (0.0,0.0,0.0)

		
		
		_Radius0("Radius0",float) = 0.0	
		_Radius1("Radius1",float) = 0.0	
		_Radius2("Radius2",float) = 0.0	
		_Radius3("Radius3",float) = 0.0	
		_Radius4("Radius4",float) = 0.0	
		_Radius5("Radius5",float) = 0.0
		_Radius6("Radius6",float) = 0.0	
		_Radius7("Radius7",float) = 0.0	

		
		_Fade0("Fade0",float) = 0.0
		_Fade1("Fade1",float) = 0.0
		_Fade2("Fade2",float) = 0.0
		_Fade3("Fade3",float) = 0.0
		_Fade4("Fade4",float) = 0.0
		_Fade5("Fade5",float) = 0.0
		_Fade6("Fade6",float) = 0.0
		_Fade7("Fade7",float) = 0.0

	} 
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma target 3.0
		#pragma surface surf NoLighting
		#include "UnityCG.cginc"
		
		struct Input {
			float2 uv_MainTex;
			float3 worldPos;	
		};
		
		sampler2D _MainTex;
		sampler2D _EchoTex;
		
		float4 _MainColor;
		
		float _DistanceFade;

	
		
		float _MaxRadius0;
		float _MaxRadius1;
		float _MaxRadius2;
		float _MaxRadius3;
		float _MaxRadius4;
		float _MaxRadius5;

		
		float _MaxFade0;
		float _MaxFade1;
		float _MaxFade2;
		float _MaxFade3;
		float _MaxFade4;
		float _MaxFade5;
		float _MaxFade6;
		float _MaxFade7;

		
		float3 _Position0;
		float3 _Position1;
		float3 _Position2;
		float3 _Position3;
		float3 _Position4;
		float3 _Position5;
		float3 _Position6;
		float3 _Position7;

		
		float _Radius0;
		float _Radius1;
		float _Radius2;
		float _Radius3;
		float _Radius4;
		float _Radius5;
		float _Radius6;
		float _Radius7;

		
		float _Fade0;
		float _Fade1;
		float _Fade2;
		float _Fade3;
		float _Fade4;
		float _Fade5;
		float _Fade6;
		float _Fade7;


		// Custom light model that ignores actual lighting. 
		half4 LightingNoLighting (SurfaceOutput s, half3 lightDir, half atten) {
			half4 c;
			c.rgb = s.Albedo;
			c.a = s.Alpha;
			return c;
		}

		float ApplyFade(Input IN,float3 position, float radius, float infade,float maxFade, float maxRadius){
			float size = 128.0; //hardcoded width/height of echo texture

			
			float dist = distance(IN.worldPos, position);	// Distance from current pixel (from its world coord) to center of echo sphere
			
			if(radius >= 3*maxRadius || dist >= radius){
				return 0.0;
			} else {
				// If _DistanceFade = true, fading is related to vertex distance from echo origin.
				// If false, fading is even across entire echo.
				float c1 = (_DistanceFade>=1.0)?dist/radius:1.0;
				 
				// Apply fading effect.
				c1 *= (infade<=maxFade)?1.0-infade/maxFade:0.0;	//adjust by fade distance.
				
				// Ignore Fade values <= 0 (meaning no fade.)
				c1 = (infade<=0)?1.0:c1;
				
				return c1;
			}
		}
		// Custom surfacer that mimics an echo effect
		void surf (Input IN, inout SurfaceOutput o) {
			float c1;

			// manually add more echos here.
			c1 = ApplyFade(IN,_Position0,_Radius0,_Fade0,_MaxFade0,_MaxRadius0);
			c1 += ApplyFade(IN,_Position1,_Radius1,_Fade1,_MaxFade1,_MaxRadius1);
			c1 += ApplyFade(IN,_Position2,_Radius2,_Fade2,_MaxFade2,_MaxRadius2);
			c1 += ApplyFade(IN,_Position3,_Radius3,_Fade3,_MaxFade3,_MaxRadius3);
			c1 += ApplyFade(IN,_Position4,_Radius4,_Fade4,_MaxFade4,_MaxRadius4);
			//c1 += ApplyFade(IN,_Position5,_Radius5,_Fade5,_MaxFade5,_MaxRadius5);
			//c1 += ApplyFade(IN,_Position6,_Radius6,_Fade6,_MaxFade6,_MaxRadius0);
			//c1 += ApplyFade(IN,_Position7,_Radius7,_Fade7,_MaxFade7,_MaxRadius0);

			c1=c1/5.0;
			
			float c2 = 1.0 - c1;
			o.Albedo = _MainColor.rgb * c2 + tex2D (_MainTex, IN.uv_MainTex).rgb * c1 ;		
		}
		ENDCG
	} 
	FallBack "Diffuse"
}

Cela fonctionne sauf que je ne peux pas avoir plus de 5 ondes sinon j'ai le message suivant (en enlevant les commentaires sur les dernières lignes c1+=... :
program 'frag_surf', Constant register limit exceeded; more than 32 constant registers needed to compile program at line 62

Est-ce possible d'utiliser plus de 32 registres ? Ou d'écrire le code différemment pour éviter ce problème ?

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Echo

Message par F@B » 10 Juil 2014 10:41

en SM3 normalement c'est 224 si je dis pas de conneries?

http://en.wikipedia.org/wiki/High-level_shader_language

t'as essayé en DX11 ? voir si ça compile?

j'ai pas trop étudié ton shader mais pas moyen de faire une boucle? je dis peut être une connerie
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

mrzepo59
Messages : 8
Inscription : 09 Juil 2014 16:20

Re: Echo

Message par mrzepo59 » 10 Juil 2014 10:49

Je ne m'y connais pas trop en shaders. Pour mettre en DX11 je change la ligne #pragma target 3.0 par #pragma target 4.0 ? C'est bien ça ?

Sinon pour la boucle apparemment c'est pas possible d'après la personne qui a créé le shader. D'après lui les tableaux sont pas vraiment supportés dans les shaders :
Arrays aren't really supported in shaders so the best way to pass in multiple properties is to use a naming convention. e.g. myVar[12] would become myVar12. Unity properties can be updated using their text name and this is what I have done in my scripts.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Echo

Message par F@B » 10 Juil 2014 10:52

tant qu'a tester met toi en sm5 #pragma target 5.0 et dans les player pref tu coche directX11 tu redémarre ton projet et tu vois.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

mrzepo59
Messages : 8
Inscription : 09 Juil 2014 16:20

Re: Echo

Message par mrzepo59 » 10 Juil 2014 10:59

En sm5 ça compile correctement cependant en cochant Use DX11 j'ai le message d'erreur "type is not a supported int value".

Ensuite je redémarre le projet et la tous les objets qui ont le shader sont complètement noir et ça aucune onde n’apparaît.

Répondre

Revenir vers « les Shaders »