// Parameter lines go here: #pragma parameter LUT_Size "LUT Size" 16.0 1.0 64.0 1.0 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; // compatibility #defines #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) void main() { gl_Position = MVPMatrix * VertexCoord; TEX0.xy = TexCoord.xy; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; uniform sampler2D SamplerLUT; COMPAT_VARYING vec4 TEX0; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define texture(c, d) COMPAT_TEXTURE(c, d) #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM uniform COMPAT_PRECISION float LUT_Size; #else #define LUT_Size 16.0 #endif // This shouldn't be necessary but it seems vec4 mixfix(vec4 a, vec4 b, float c) { return (c > 0.0 && a.y < 1.0) ? mix(a, b, c) : a; } void main() { vec4 imgColor = texture(Source, vTexCoord.xy); float red = ( imgColor.r * (LUT_Size - 1.0) + 0.4999 ) / (LUT_Size * LUT_Size); float green = ( imgColor.g * (LUT_Size - 1.0) + 0.4999 ) / LUT_Size; float blue1 = (floor(imgColor.b * (LUT_Size - 1.0)) / LUT_Size) + red; float blue2 = (ceil(imgColor.b * (LUT_Size - 1.0)) / LUT_Size) + red; float mixer = (imgColor.b - blue1) / (blue2 - blue1); vec4 color1 = texture( SamplerLUT, vec2( blue1, green )); vec4 color2 = texture( SamplerLUT, vec2( blue2, green )); FragColor = mixfix(color1, color2, mixer); } #endif