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 ?