HueMap

Zum Beispiel die abwechselnd farbigen Blätter eines Baumes im Herbst könnten dank dieses Shaders mit nur einer einzigen Textur dargestellt werden.

Screenshot:

Vertex Shader:

uniform vec3 LightPos;
varying float LightIntensity;
varying vec2 UVCoord;

vec3  Normal;
vec3  EyeDir;
vec4  EyePos;

void main(){
  Normal         = normalize(gl_NormalMatrix * gl_Normal);
  vec4 pos       = gl_ModelViewMatrix * gl_Vertex;
  EyeDir         = pos.xyz;
  EyePos		     = gl_ModelViewProjectionMatrix * gl_Vertex;
  LightIntensity = max(dot(normalize(LightPos - EyeDir), Normal), 0.0);

  gl_Position    = ftransform();
	UVCoord 		   = gl_MultiTexCoord0.st;
  }

Fragment Shader:

varying float LightIntensity;
varying vec2 UVCoord;
uniform sampler2D sampler2d;
uniform float ShiftFactor;
uniform float BaseHue;
uniform float Desaturate;

const float third = 1.0/3.0;
const vec3  grey  = vec3(0.5);

void main(){
  vec3  thisTex   = vec3(texture2D(sampler2d,UVCoord.st));
	float hueMap    = thisTex.r * ShiftFactor;
	float brightMap = thisTex.g;
	float alphaMap  = thisTex.b;
    
	vec3 hueshift   = BaseHue+vec3(hueMap,hueMap+third,hueMap-third);
	vec3 Color      = abs(fract(hueshift)-0.5)*2.0;
	
  Color  = mix(Color, grey, Desaturate);
	Color *= brightMap;
	Color *= LightIntensity;
   
   gl_FragColor = vec4(Color, 1.0);
	
	if (alphaMap <= 0.3){
	  discard;
	}
}