2

我的印象(这个问题的答案似乎证实了这一点)我可以从 GPUImageTwoPassFilter 子类化以有效地在图像上连续运行两个片段着色器,但将所有代码等限制在一个类中。然而,在我的实验中,似乎没有编译过第二个片段着色器,更不用说执行了。下面的示例可以毫无怨言地构建和运行。生成的图像看起来就像只有第一个片段着色器在单着色器类中运行一样。

这里可能出了什么问题?我可以在 GPUImage 代码库中找到的所有示例都没有帮助,即子类 GPUImageTwoPassFilter 只是对每个通道使用相同的片段着色器程序(如在 GPUImageGaussianBlurFilter 中)。

#import "BFTwoPassTest.h"

NSString *const kBFTwoPassTestFirstFragmentShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;

 void main()
 {
     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
     gl_FragColor = vec4(1.0, textureColor.g, textureColor.b, 1.0);
 }
 );


NSString *const kBFTwoPassTestSecondFragmentShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;

 void main()
 {
     This should be an obvious syntax error.
 }
 );


@implementation BFTwoPassTest

- (id)init {
    self = [self initWithFirstStageFragmentShaderFromString:kBFTwoPassTestFirstFragmentShaderString secondStageFragmentShaderFromString:kBFTwoPassTestSecondFragmentShaderString];
    if (self) {

    }
    return self;
}


@end
4

1 回答 1

1

糟糕,GPUImageTwoPassFilter.m 的第 55 行有一个错误。以下行:

if (!(self = [self initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:kGPUImageVertexShaderString secondStageFragmentShaderFromString:firstStageFragmentShaderString]))

本来应该

if (!(self = [self initWithFirstStageVertexShaderFromString:kGPUImageVertexShaderString firstStageFragmentShaderFromString:firstStageFragmentShaderString secondStageVertexShaderFromString:kGPUImageVertexShaderString secondStageFragmentShaderFromString:secondStageFragmentShaderString]))

感谢您指出这一点,现在应该在存储库中修复。但是,将来我是否可以建议将此类特定框架问题发布到项目的 GitHub 问题页面而不是此处?

于 2013-02-15T21:50:14.850 回答