我正在使用GPUImage。但是没有内置功能可以对图像使用有序抖动过滤器。我使用以下代码来获取有序抖动过滤器。但是此代码产生了白色背景,并且没有显示图像。
GPUImageDitherFilter.h
@interface GPUImageDitherFilter : GPUImageFilter {
GLint texelWidthUniform, texelHeightUniform;
}
GPUImageDitherFilter.m
NSString *const kBFBWOrderedDither = SHADER_STRING
(
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
// uniform lowp mat4 bayerMatrix;
uniform lowp float bayerArray[16];
uniform lowp float texelWidth;
uniform lowp float texelHeight;
void main()
{
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
mediump int x = int(mod(textureCoordinate.x / texelWidth, 4.0));
mediump int y = int(mod(textureCoordinate.y / texelHeight, 4.0));
mediump int arrayIndex = (y * 4) + x;
if (textureColor.r >= bayerArray[arrayIndex]) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
else {
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}
}
);
@implementation GPUImageDitherFilter
-(id)init {
self = [self initWithFragmentShaderFromString:kBFBWOrderedDither];
if (self) {
texelWidthUniform = [filterProgram uniformIndex:@"texelWidth"];
texelHeightUniform = [filterProgram uniformIndex:@"texelHeight"];
float multiplier = 1.0/17.0;
GPUMatrix4x4 bayerMatrix = {
{1 * multiplier, 9 * multiplier, 3 * multiplier, 11 * multiplier},
{13 * multiplier, 5 * multiplier, 15 * multiplier, 7 * multiplier},
{4 * multiplier, 12 * multiplier, 2 * multiplier, 10 * multiplier},
{16 * multiplier, 8 * multiplier, 14 * multiplier, 6 * multiplier}
};
GLint bayerMatrixUniform = [filterProgram uniformIndex:@"bayerMatrix"];
[self setMatrix4f:bayerMatrix forUniform:bayerMatrixUniform program:filterProgram];
}
return self;
}
- (void)setupFilterForSize:(CGSize)filterFrameSize
{
[super setupFilterForSize:filterFrameSize];
CGFloat texelWidth = 1.0 / filterFrameSize.width;
CGFloat texelHeight = 1.0 / filterFrameSize.height;
runSynchronouslyOnVideoProcessingQueue(^{
[self setFloat:texelWidth forUniform:self->texelWidthUniform program:self->filterProgram];
[self setFloat:texelHeight forUniform:self->texelHeightUniform program:self->filterProgram];
});
}
@end
这段代码有什么问题?需要帮忙。
我从这里得到了这个代码