Inzwischen habe ich einen shader, der sich sogar laden lässt. Mit dem cgc compeliert bringt er es auf ganze 419 Instruktionen. Somit werden zum komprimieren eines Pixels etwa 26 Instrukionen gebraucht. Immerhin kann man sehen, dass sämpliche Forschleifen entrollt wurden und das selbst die 16 vec2 konstanten zu einem einfachem floatvektor umgebaut werden.
Prinzipell sollte GLSL im algeminen keinen nachteil gegenüber einem assembler program haebn, aber man vergisst schnell, das einiges an code 16 x ausgeführt wird...
Code: uniform sampler2D Texture0; uniform sampler2D Lookup2D; //256x256 float16 lookuptable for indizies uniform sampler3D Lookup3D; //32x64x32 float16 lookuptable for colors, both are filled with shorts from 0 to 2^16 #define SZ1 0.5 / 4096.0 #define SZ2 1.5 / 4096.0 const vec2 texofset[16] = {vec2 (-SZ2,-SZ2), vec2 (-SZ1,-SZ2), vec2 (SZ1,-SZ2), vec2 (SZ2,-SZ2), vec2 (-SZ2,-SZ1), vec2 (-SZ1,-SZ1), vec2 (SZ1,-SZ1), vec2 (SZ2,-SZ1), vec2 (-SZ2, SZ1), vec2 (-SZ1, SZ1), vec2 (SZ1, SZ1), vec2 (SZ2, SZ1), vec2 (-SZ2, SZ2), vec2 (-SZ1, SZ2), vec2 (SZ1, SZ2), vec2 (SZ2, SZ2)}; const float fac[4] = {1.0,4.0,16.0,64.0}; vec4 inputs[16]; void main(){ vec4 middle=vec4(0.0,0.0,0.0,0.0); int i =0; for (i=0;i<16;i++){ inputs[i].rgb=texture2D(Texture0, vec2(gl_TexCoord[0])+texofset[i]).rgb; inputs[i].a = dot(inputs[i].rgb,vec3(0.299, 0.587, 0.114)); // caluculate Hue middle += inputs[i]; } middle /= 16.0; vec4 delta = vec4(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 ).r; //First color gl_FragColor.g = texture3D(Lookup3D, middle.rgb - delta.rgb ).r; //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]={0.0,0.0,0.0,0.0}; for ( i=0; i<4 ;i++) for (int j=0; j<4 ;j++){ if (inputs[j+4*i].a > B[1]){ if (inputs[j+4*i].a < B[0]){ index[i] += fac[j] * 3.0; } else{ index[i] += fac[j] /** 1.0*/; } } else{ if (inputs[j+4*i].a > B[2]){ index[i] += fac[j] * 2.0; } /*else{ index[i] += fac[j] * 0.0; }*/ } } gl_FragColor.b = texture2D(Lookup2D, vec2(index[0],index[1])).r; //Samples 0 to 7 gl_FragColor.a = texture2D(Lookup2D, vec2(index[2],index[3])).r; //Samples 8 to 15 }
|