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;
}
}