Procedural Chess Texture (Smooth)

Ein procedurales Schachmuster mit smoothstep() Funktion.

Screenshot:

Vertex Shader:

uniform vec3 LightPosition;
vec3  Normal;
varying float LightIntensity;
varying vec3  OBposition;

void main(void) {
  //light
  Normal            = normalize(gl_NormalMatrix * gl_Normal);
  vec4 pos         = gl_ModelViewMatrix * gl_Vertex;
  LightIntensity = max(dot(normalize(LightPosition - pos.xyz), Normal), 0.0);
  //end light

  OBposition      = gl_Vertex.xyz;
  gl_Position     = ftransform();
}

Fragment Shader:

varying float LightIntensity;
varying vec3  OBposition;
uniform vec3 darkColor;
uniform vec3 brightColor;
uniform float chessSize;
uniform float smoothFactor;

void main(){
  float halfChess = chessSize / 2.0;
  vec3 position = mod(OBposition,chessSize);
  position = abs(position-halfChess)*2.0;
  vec3 useColor = smoothstep(halfChess-smoothFactor,
		halfChess+smoothFactor,position);
  useColor -= smoothstep(halfChess-smoothFactor,
		halfChess+smoothFactor,chessSize-position);
  
  //float mixVal = clamp(useColor.x * useColor.y * useColor.z,0.0,1.0);
  float mixVal = max(useColor.x * useColor.y * useColor.z,0.0);
  vec3 color   = mix(darkColor, brightColor, mixVal);

  gl_FragColor = vec4(color * LightIntensity, 1.0);
}