0

我正在使用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

这段代码有什么问题?需要帮忙。
我从这里得到了这个代码

4

0 回答 0