GPUImageTwoPassFilter からサブクラス化して、画像に対して 2 つのフラグメント シェーダーを連続して効果的に実行できるが、すべてのコードなどを 1 つのクラスに限定できるというのが私の印象です (そして、この質問への回答がそれを裏付けているようです)。ただし、私の実験では、2 番目のフラグメント シェーダーがコンパイルされているようには見えず、ましてや実行されているようには見えません。以下の例は、問題なくビルドおよび実行されます。結果のイメージは、単一シェーダー クラスで最初のフラグメント シェーダーのみが実行された場合と同じように見えます。
ここで何がうまくいかないのでしょうか?GPUImageTwoPassFilter をサブクラス化する GPUImage コード ベースで見つけることができるすべての例が、(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