#import "GPUImageLookupFilter.h"
|
|
#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
|
NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING
|
(
|
varying highp vec2 textureCoordinate;
|
varying highp vec2 textureCoordinate2; // TODO: This is not used
|
|
uniform sampler2D inputImageTexture;
|
uniform sampler2D inputImageTexture2; // lookup texture
|
|
uniform lowp float intensity;
|
|
void main()
|
{
|
highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
|
|
highp float blueColor = textureColor.b * 63.0;
|
|
highp vec2 quad1;
|
quad1.y = floor(floor(blueColor) / 8.0);
|
quad1.x = floor(blueColor) - (quad1.y * 8.0);
|
|
highp vec2 quad2;
|
quad2.y = floor(ceil(blueColor) / 8.0);
|
quad2.x = ceil(blueColor) - (quad2.y * 8.0);
|
|
highp vec2 texPos1;
|
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
|
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
|
|
highp vec2 texPos2;
|
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
|
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
|
|
lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
|
lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2);
|
|
lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
|
gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity);
|
}
|
);
|
#else
|
NSString *const kGPUImageLookupFragmentShaderString = SHADER_STRING
|
(
|
varying vec2 textureCoordinate;
|
varying vec2 textureCoordinate2; // TODO: This is not used
|
|
uniform sampler2D inputImageTexture;
|
uniform sampler2D inputImageTexture2; // lookup texture
|
|
uniform float intensity;
|
|
void main()
|
{
|
vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
|
|
float blueColor = textureColor.b * 63.0;
|
|
vec2 quad1;
|
quad1.y = floor(floor(blueColor) / 8.0);
|
quad1.x = floor(blueColor) - (quad1.y * 8.0);
|
|
vec2 quad2;
|
quad2.y = floor(ceil(blueColor) / 8.0);
|
quad2.x = ceil(blueColor) - (quad2.y * 8.0);
|
|
vec2 texPos1;
|
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
|
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
|
|
vec2 texPos2;
|
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
|
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
|
|
vec4 newColor1 = texture2D(inputImageTexture2, texPos1);
|
vec4 newColor2 = texture2D(inputImageTexture2, texPos2);
|
|
vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
|
gl_FragColor = mix(textureColor, vec4(newColor.rgb, textureColor.w), intensity);
|
}
|
);
|
#endif
|
|
@implementation GPUImageLookupFilter
|
|
@synthesize intensity = _intensity;
|
|
#pragma mark -
|
#pragma mark Initialization and teardown
|
|
- (id)init;
|
{
|
intensityUniform = [filterProgram uniformIndex:@"intensity"];
|
self.intensity = 1.0f;
|
|
if (!(self = [super initWithFragmentShaderFromString:kGPUImageLookupFragmentShaderString]))
|
{
|
return nil;
|
}
|
|
return self;
|
}
|
|
#pragma mark -
|
#pragma mark Accessors
|
|
- (void)setIntensity:(CGFloat)intensity
|
{
|
_intensity = intensity;
|
|
[self setFloat:_intensity forUniform:intensityUniform program:filterProgram];
|
}
|
|
@end
|