From f8c5b663c4ea8010a5bf9b4cad1fc31a25bd0221 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 19 Feb 2007 23:40:46 +0000 Subject: [PATCH] add mixing shaders --- stepmania/Data/Shaders/GLSL/Color burn.frag | 65 +++++++++++++ stepmania/Data/Shaders/GLSL/Color dodge.frag | 66 +++++++++++++ stepmania/Data/Shaders/GLSL/Hard mix.frag | 92 +++++++++++++++++++ .../Shaders/GLSL/Texture matrix scaling.vert | 11 +++ stepmania/Data/Shaders/GLSL/Vivid light.frag | 69 ++++++++++++++ 5 files changed, 303 insertions(+) create mode 100644 stepmania/Data/Shaders/GLSL/Color burn.frag create mode 100644 stepmania/Data/Shaders/GLSL/Color dodge.frag create mode 100644 stepmania/Data/Shaders/GLSL/Hard mix.frag create mode 100644 stepmania/Data/Shaders/GLSL/Texture matrix scaling.vert create mode 100644 stepmania/Data/Shaders/GLSL/Vivid light.frag diff --git a/stepmania/Data/Shaders/GLSL/Color burn.frag b/stepmania/Data/Shaders/GLSL/Color burn.frag new file mode 100644 index 0000000000..ea0f742aad --- /dev/null +++ b/stepmania/Data/Shaders/GLSL/Color burn.frag @@ -0,0 +1,65 @@ +uniform sampler2D Texture1; +uniform sampler2D Texture2; + +vec4 ApplyBurn( vec4 over, vec4 under, float fill ) +{ + vec3 NeutralColor = vec3(1,1,1); + over.rgb = mix( NeutralColor, over.rgb, fill ); + + vec4 ret; + ret.rgb = (over.rgb + under.rgb - 1); + + ret.rgb /= max(over.rgb, 0.000001); + ret.rgb *= over.a*under.a; + ret = clamp( ret, 0.0, 1.0 ); + + ret.a = over.a * under.a; + + return ret; +} + +void main(void) +{ + vec4 under = texture2DProj( Texture1, gl_TexCoord[0] ); + vec4 over = texture2DProj( Texture2, gl_TexCoord[0] ); + + vec4 ret = ApplyBurn( over, under, gl_Color.a ); + + ret.rgb += (1.0 - over.a) * under.rgb * under.a; + ret.a += (1.0 - over.a) * under.a; + + over.a *= gl_Color.a; + ret.rgb += (1.0 - under.a) * over.rgb * over.a; + ret.a += (1.0 - under.a) * over.a; + + ret.rgb /= ret.a; + + gl_FragColor = ret; + return; +} + +/* + * Copyright (c) 2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + diff --git a/stepmania/Data/Shaders/GLSL/Color dodge.frag b/stepmania/Data/Shaders/GLSL/Color dodge.frag new file mode 100644 index 0000000000..b1c4c92552 --- /dev/null +++ b/stepmania/Data/Shaders/GLSL/Color dodge.frag @@ -0,0 +1,66 @@ +uniform sampler2D Texture1; +uniform sampler2D Texture2; + +vec4 ApplyDodge( vec4 over, vec4 under, float fill ) +{ + vec3 NeutralColor = vec3(0,0,0); + over.rgb = mix( NeutralColor, over.rgb, fill ); + + vec4 ret; + ret.rgb = under.rgb; + + ret.rgb /= max(1-over.rgb, 0.000001); + ret.rgb = min(ret.rgb, 1); + ret.rgb *= over.a*under.a; +// ret = clamp( ret, 0.0, 1.0 ); + + ret.a = over.a * under.a; + + return ret; +} + +void main(void) +{ + vec4 under = texture2DProj( Texture1, gl_TexCoord[0] ); + vec4 over = texture2DProj( Texture2, gl_TexCoord[0] ); + + vec4 ret = ApplyDodge( over, under, gl_Color.a ); + + ret.rgb += (1.0 - over.a) * under.rgb * under.a; + ret.a += (1.0 - over.a) * under.a; + + over.a *= gl_Color.a; + ret.rgb += (1.0 - under.a) * over.rgb * over.a; + ret.a += (1.0 - under.a) * over.a; + + ret.rgb /= ret.a; + + gl_FragColor = ret; + return; +} + +/* + * Copyright (c) 2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + diff --git a/stepmania/Data/Shaders/GLSL/Hard mix.frag b/stepmania/Data/Shaders/GLSL/Hard mix.frag new file mode 100644 index 0000000000..4002210784 --- /dev/null +++ b/stepmania/Data/Shaders/GLSL/Hard mix.frag @@ -0,0 +1,92 @@ +uniform sampler2D Texture1; +uniform sampler2D Texture2; + +vec4 ApplyVividLight( vec4 over, vec4 under, float fill ) +{ + vec3 NeutralColor = vec3(.5,.5,.5); + over.rgb = mix( NeutralColor, over.rgb, fill ); + + over.rgb -= 0.5; + over.rgb *= 2.0; + + vec4 ret; + ret.rgb = under.rgb; + ret.rgb += min(over.rgb, 0); + ret.rgb /= max(1-abs(over.rgb), 0.000001); + ret.rgb *= under.a; + ret = clamp( ret, 0.0, 1.0 ); + ret.rgb *= over.a; + + ret.a = over.a * under.a; + + return ret; +} + +vec4 ApplyHardMix( vec4 over, vec4 under, float fill ) +{ + vec4 ret = ApplyVividLight( over, under, gl_Color.a ); + + /* ret is premultiplied. Undo this, so we have a + * 0..1 range for color. */ + ret.rgb /= ret.a; + + fill *= fill; + + /* Posterize, with a threshold based on fill. This is a rough + * approximation. */ + float low = 0.5-(1.0-fill)*0.5; + float high = 0.5+(1.0-fill)*0.5+0.00001; + ret.rgb = (ret.rgb - low) / (high - low); + ret = clamp( ret, 0.0, 1.0 ); + + /* Premultiply it, for the rest of the calculation. */ + ret.rgb *= ret.a; + + return ret; +} + +void main(void) +{ + vec4 under = texture2DProj( Texture1, gl_TexCoord[0] ); + vec4 over = texture2DProj( Texture2, gl_TexCoord[0] ); + + vec4 ret = ApplyHardMix( over, under, gl_Color.a ); + + ret.rgb += (1.0 - over.a) * under.rgb * under.a; + ret.a += (1.0 - over.a) * under.a; + + over.a *= gl_Color.a; + ret.rgb += (1.0 - under.a) * over.rgb * over.a; + ret.a += (1.0 - under.a) * over.a; + + ret.rgb /= ret.a; + + gl_FragColor = ret; + return; +} + +/* + * Copyright (c) 2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + diff --git a/stepmania/Data/Shaders/GLSL/Texture matrix scaling.vert b/stepmania/Data/Shaders/GLSL/Texture matrix scaling.vert new file mode 100644 index 0000000000..9bc1e55360 --- /dev/null +++ b/stepmania/Data/Shaders/GLSL/Texture matrix scaling.vert @@ -0,0 +1,11 @@ +attribute vec4 TextureMatrixScale; + +void main(void) +{ + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + vec4 multiplied_tex_coord = gl_TextureMatrix[0] * gl_MultiTexCoord0; + gl_TexCoord[0] = (multiplied_tex_coord * TextureMatrixScale) + + (gl_MultiTexCoord0 * (vec4(1)-TextureMatrixScale)); + gl_FrontColor = gl_Color; +} + diff --git a/stepmania/Data/Shaders/GLSL/Vivid light.frag b/stepmania/Data/Shaders/GLSL/Vivid light.frag new file mode 100644 index 0000000000..c26973a646 --- /dev/null +++ b/stepmania/Data/Shaders/GLSL/Vivid light.frag @@ -0,0 +1,69 @@ +uniform sampler2D Texture1; +uniform sampler2D Texture2; + +vec4 ApplyVividLight( vec4 over, vec4 under, float fill ) +{ + vec3 NeutralColor = vec3(.5,.5,.5); + over.rgb = mix( NeutralColor, over.rgb, fill ); + + over.rgb -= 0.5; + over.rgb *= 2.0; + + vec4 ret; + ret.rgb = under.rgb; + ret.rgb += min(over.rgb, 0); + ret.rgb /= max(1-abs(over.rgb), 0.000001); + ret.rgb *= under.a; + ret = clamp( ret, 0.0, 1.0 ); + ret.rgb *= over.a; + + ret.a = over.a * under.a; + + return ret; +} + +void main(void) +{ + vec4 under = texture2DProj( Texture1, gl_TexCoord[0] ); + vec4 over = texture2DProj( Texture2, gl_TexCoord[0] ); + + vec4 ret = ApplyVividLight( over, under, gl_Color.a ); + + ret.rgb += (1.0 - over.a) * under.rgb * under.a; + ret.a += (1.0 - over.a) * under.a; + + over.a *= gl_Color.a; + ret.rgb += (1.0 - under.a) * over.rgb * over.a; + ret.a += (1.0 - under.a) * over.a; + + ret.rgb /= ret.a; + + gl_FragColor = ret; + return; +} + +/* + * Copyright (c) 2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +