guest  Real addict
  

Status:Offline Date registered: 30.07.2004 Post:856 Send Message | Created on 12.10.2006 - 23:22 |  |
The shader does some adaptable color reduction to gain sharp-edged images on bilinear enlarged surfaces.
fragment file:
// ColorReductionScaler shader
// (c) 2006 guest(r)
const float filterparam = 10.0;
uniform sampler2D OGL2Texture;
void main()
{
vec3 c00 = texture2D(OGL2Texture, gl_TexCoord[5].xy).xyz;
vec3 c10 = texture2D(OGL2Texture, gl_TexCoord[1].xy).xyz;
vec3 c20 = texture2D(OGL2Texture, gl_TexCoord[2].zw).xyz;
vec3 c01 = texture2D(OGL2Texture, gl_TexCoord[3].xy).xyz;
vec3 c11 = texture2D(OGL2Texture, gl_TexCoord[0].xy).xyz;
vec3 c21 = texture2D(OGL2Texture, gl_TexCoord[4].xy).xyz;
vec3 c02 = texture2D(OGL2Texture, gl_TexCoord[1].zw).xyz;
vec3 c12 = texture2D(OGL2Texture, gl_TexCoord[2].xy).xyz;
vec3 c22 = texture2D(OGL2Texture, gl_TexCoord[6].xy).xyz;
vec3 dt = vec3(1.0,1.0,1.0);
vec3 mn1 = min(min(c00,c01),c02);
vec3 mn2 = min(min(c10,c11),c12);
vec3 mn3 = min(min(c20,c21),c22);
vec3 mx1 = max(max(c00,c01),c02);
vec3 mx2 = max(max(c10,c11),c12);
vec3 mx3 = max(max(c20,c21),c22);
mn1 = min(min(mn1,mn2),mn3);
mx1 = max(max(mx1,mx2),mx3);
float dif1 = pow(dot(abs(c11-mn1),dt) + 0.001, filterparam);
float dif2 = pow(dot(abs(c11-mx1),dt) + 0.001, filterparam);
gl_FragColor.xyz = (dif1*mx1 + dif2*mn1)/(dif1+dif2);
}
vertex file:
uniform vec4 OGL2Param;
uniform vec4 OGL2Size;
void main()
{
float x = (OGL2Size.x/2048.0)*OGL2Param.x;
float y = (OGL2Size.y/1024.0)*OGL2Param.y;
vec2 dg1 = vec2( x,y);
vec2 dg2 = vec2(-x,y);
vec2 dx = vec2(x,0.0);
vec2 dy = vec2(0.0,y);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1].xy = gl_TexCoord[0].xy - dy;
gl_TexCoord[2].xy = gl_TexCoord[0].xy + dy;
gl_TexCoord[3].xy = gl_TexCoord[0].xy - dx;
gl_TexCoord[4].xy = gl_TexCoord[0].xy + dx;
gl_TexCoord[5].xy = gl_TexCoord[0].xy - dg1;
gl_TexCoord[6].xy = gl_TexCoord[0].xy + dg1;
gl_TexCoord[1].zw = gl_TexCoord[0].xy - dg2;
gl_TexCoord[2].zw = gl_TexCoord[0].xy + dg2;
}
|
guest  Real addict
  

Status:Offline Date registered: 30.07.2004 Post:856 Send Message | Created on 19.10.2006 - 20:48 |  |
Shadeview version:
Nice for movies. Looks good with bilinear/trilinear resizing to higher resolutions.
vertex file
uniform vec4 tex_attribs;
uniform vec4 img_attribs1;
void main()
{
float x = tex_attribs.x;
float y = tex_attribs.y;
vec2 dg1 = vec2( x,y);
vec2 dg2 = vec2(-x,y);
vec2 dx = vec2(x,0.0);
vec2 dy = vec2(0.0,y);
gl_Position = ftransform();
gl_TexCoord[0] = gl_Vertex * img_attribs1;
gl_TexCoord[1].xy = gl_TexCoord[0].xy - dy;
gl_TexCoord[2].xy = gl_TexCoord[0].xy + dy;
gl_TexCoord[3].xy = gl_TexCoord[0].xy - dx;
gl_TexCoord[4].xy = gl_TexCoord[0].xy + dx;
gl_TexCoord[5].xy = gl_TexCoord[0].xy - dg1;
gl_TexCoord[6].xy = gl_TexCoord[0].xy + dg1;
gl_TexCoord[1].zw = gl_TexCoord[0].xy - dg2;
gl_TexCoord[2].zw = gl_TexCoord[0].xy + dg2;
}
fragment file
// ColorReductionScaler shader
// (c) 2006 guest(r)
uniform sampler2D tex0;
uniform vec4 tex_attribs;
const float filterparam = 10.0;
const float strtw = 1.00;
const float max_w = 1.00;
const float min_w = 0.15;
const float lum_add = 0.20;
const float k = -2.0;
void main (void)
{
vec3 c00 = texture2D(tex0, gl_TexCoord[5].xy).xyz;
vec3 c10 = texture2D(tex0, gl_TexCoord[1].xy).xyz;
vec3 c20 = texture2D(tex0, gl_TexCoord[2].zw).xyz;
vec3 c01 = texture2D(tex0, gl_TexCoord[3].xy).xyz;
vec3 c11 = texture2D(tex0, gl_TexCoord[0].xy).xyz;
vec3 c21 = texture2D(tex0, gl_TexCoord[4].xy).xyz;
vec3 c02 = texture2D(tex0, gl_TexCoord[1].zw).xyz;
vec3 c12 = texture2D(tex0, gl_TexCoord[2].xy).xyz;
vec3 c22 = texture2D(tex0, gl_TexCoord[6].xy).xyz;
vec3 dt = vec3(1.0,1.0,1.0);
vec3 mn1 = min(min(c00,c01),c02);
vec3 mn2 = min(min(c10,c11),c12);
vec3 mn3 = min(min(c20,c21),c22);
vec3 mx1 = max(max(c00,c01),c02);
vec3 mx2 = max(max(c10,c11),c12);
vec3 mx3 = max(max(c20,c21),c22);
mn1 = min(min(mn1,mn2),mn3);
mx1 = max(max(mx1,mx2),mx3);
float dif1 = pow(dot(abs(c11-mn1),dt) + 0.001, filterparam);
float dif2 = pow(dot(abs(c11-mx1),dt) + 0.001, filterparam);
c11 = (dif1*mx1 + dif2*mn1)/(dif1+dif2);
float ww = k/(0.1*dot(c10+c01+c12+c21+c11,dt)+lum_add);
float w1 = clamp(ww*dot(abs(c10-c11),dt)+strtw,min_w,max_w);
float w2 = clamp(ww*dot(abs(c01-c11),dt)+strtw,min_w,max_w);
float w3 = clamp(ww*dot(abs(c12-c11),dt)+strtw,min_w,max_w);
float w4 = clamp(ww*dot(abs(c21-c11),dt)+strtw,min_w,max_w);
gl_FragColor.xyz = (w1*c10 + w2*c01 + w3*c12+ w4*c21 + c11)/(w1+w2+w3+w4+1.0);
}
[Dieser Beitrag wurde am 20.10.2006 - 22:30 von guest aktualisiert]
|