- uniform sampler2D Texture0;
- uniform sampler2D Lookup2D; //256x256 lookuptable for indizies
- uniform sampler3D Lookup3D; //32x64x32 lookuptable for colors
- #define sz = 1.0 / 4096
- const vec2 texofset[16] = {vec2 (-1.5 * sz,-1.5 * sz), vec2 (-0.5 * sz,-1.5 * sz), vec2 (0.5 * sz,-1.5 * sz), vec2 (1.5 * sz,-1.5 * sz),
- vec2 (-1.5 * sz,-0.5 * sz), vec2 (-0.5 * sz,-0.5 * sz), vec2 (0.5 * sz,-0.5 * sz), vec2 (1.5 * sz,-0.5 * sz),
- vec2 (-1.5 * sz, 0.5 * sz), vec2 (-0.5 * sz, 0.5 * sz), vec2 (0.5 * sz, 0.5 * sz), vec2 (1.5 * sz, 0.5 * sz),
- vec2 (-1.5 * sz, 1.5 * sz), vec2 (-0.5 * sz, 1.5 * sz), vec2 (0.5 * sz, 1.5 * sz), vec2 (1.5 * sz, 1.5 * sz)};
- const float fac[4] = {1.0,4.0,16.0,64.0};
- vec4 inputs[16];
- main(){
- vec4 middle=vec3(0.0,0.0,0.0,0.0);
- int i;
- for (i=0;i<16;i++){
- inputs[i].rgb=texture2D(Texture0, vec(gl_TexCoord[0])+texofset[i]);
- inputs[i].a = dot(inputs[i].rgb,vec3(0.299, 0.587, 0.114));
- middle += inputs[i];
- }
- middle /= 16.0;
- vec4 delta = vec3(0.0,0.0,0.0,0.0);
- float deltac = 0.0;
- for (i=0;i<16;i++){
- if (inputs[i].a > middle.a){
- delta += inputs[i];
- deltac += 1.0;
- }
- }
- delta = (delta / deltac - middle) * 2.0;
- gl_FragColor.r = texture3D(Lookup3D, middle.rgb + delta.rgb ); //First color
- gl_FragColor.g = texture3D(Lookup3D, middle.rgb - delta.rgb ); //Secondary Color
- float B[3];
- B[0]=middle.a + delta.a * 0.6667;
- B[1]=middle.a;
- B[2]=middle.a - delta.a * 0.6667;
- float index[4];
- for (i=0;i<4;i++){
- index[i]=0.0;
- for (int j=0; j<4 ;j++){
- if (inputs[i*4+j].a > B[0]){
- // It's color 0 (ligth) do nothing
- break;
- }
- if (inputs[i*4+j].a > B[1]){
- index[i] += fac[j] * 2.0; // It's color 2 (lighter)
- break;
- }
- if (inputs[i*4+j].a > B[2]){
- index[i] += fac[j] * 3.0; // It's color 3 (darker)
- break;
- }
- index[i] += fac[j] * 1.0; // It's color 1 (dark)
- }
- }
- gl_FragColor.b = texture2D(Lookup2D, vec2(index[0],index[1])); //Samples 0 to 7
- gl_FragColor.a = texture2D(Lookup2D, vec2(index[2],index[3])); //Samples 8 to 15
- }