#import "GPUImageHistogramGenerator.h" NSString *const kGPUImageHistogramGeneratorVertexShaderString = SHADER_STRING ( attribute vec4 position; attribute vec4 inputTextureCoordinate; varying vec2 textureCoordinate; varying float height; void main() { gl_Position = position; textureCoordinate = vec2(inputTextureCoordinate.x, 0.5); height = 1.0 - inputTextureCoordinate.y; } ); #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSString *const kGPUImageHistogramGeneratorFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; varying highp float height; uniform sampler2D inputImageTexture; uniform lowp vec4 backgroundColor; void main() { lowp vec3 colorChannels = texture2D(inputImageTexture, textureCoordinate).rgb; lowp vec4 heightTest = vec4(step(height, colorChannels), 1.0); gl_FragColor = mix(backgroundColor, heightTest, heightTest.r + heightTest.g + heightTest.b); } ); #else NSString *const kGPUImageHistogramGeneratorFragmentShaderString = SHADER_STRING ( varying vec2 textureCoordinate; varying float height; uniform sampler2D inputImageTexture; uniform vec4 backgroundColor; void main() { vec3 colorChannels = texture2D(inputImageTexture, textureCoordinate).rgb; vec4 heightTest = vec4(step(height, colorChannels), 1.0); gl_FragColor = mix(backgroundColor, heightTest, heightTest.r + heightTest.g + heightTest.b); } ); #endif @implementation GPUImageHistogramGenerator #pragma mark - #pragma mark Initialization and teardown - (id)init; { if (!(self = [super initWithVertexShaderFromString:kGPUImageHistogramGeneratorVertexShaderString fragmentShaderFromString:kGPUImageHistogramGeneratorFragmentShaderString])) { return nil; } backgroundColorUniform = [filterProgram uniformIndex:@"backgroundColor"]; [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:0.0]; return self; } #pragma mark - #pragma mark Accessors - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; { // GLfloat backgroundColor[4]; // backgroundColor[0] = redComponent; // backgroundColor[1] = greenComponent; // backgroundColor[2] = blueComponent; // backgroundColor[3] = alphaComponent; GPUVector4 backgroundColor = {redComponent, greenComponent, blueComponent, alphaComponent}; [self setVec4:backgroundColor forUniform:backgroundColorUniform program:filterProgram]; } @end