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