
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ iphone рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо GPUImage рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, OpenGL ES рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╢реЗрдбрд░ рд▓рд┐рдЦреЗрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИрдВред
GPUImage рдврд╛рдВрдЪрд╛
GPUImage рдПрдХ рдЖрдИрдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рдмреНрд░реИрдб рд▓рд╛рд░реНрд╕рди рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ рдФрд░ рдмреАрдПрд╕рдбреА рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдПрдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ GPU, рдлрд┐рд▓реНрдореЛрдВ, рд▓рд╛рдЗрд╡ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
GPU рдмрдирд╛рдо CPU
рдкреНрд░рддреНрдпреЗрдХ iPhone рджреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реИ: рд╕реАрдкреАрдпреВ рдФрд░ рдЬреАрдкреАрдпреВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рддрд╛рдХрдд рдФрд░ рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рд╣реИрдВред
рдЬрдм рдЖрдк Xcode рдореЗрдВ C рдпрд╛ Objective-C рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ CPU рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЬреАрдкреАрдпреВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд┐рдк рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрд┐рд╕реЗ рдХрдИ рдЫреЛрдЯреЗ, рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░рддрд┐рдкрд╛рджрдиред GPU рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ CPU рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо OpenGL рдореЗрдВ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ shader рднрд╛рд╖рд╛ GLSL рдореЗрдВ) рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рд╕реАрдкреАрдпреВ рдФрд░ рдЬреАрдкреАрдпреВ рдкрд░ рд╡реАрдбрд┐рдпреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд╛рд▓ рд╣реИрдВ:
рдлреНрд░реЗрдо рджрд░: рд╕реАрдкреАрдпреВ рдмрдирд╛рдоред GPU (рдмрдбрд╝рд╛ рдПрдлрдкреАрдПрд╕ рдмреЗрд╣рддрд░ рд╣реИ)
рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ | GPU FPS | рд╕реАрдкреАрдпреВ рдПрдлрдкреАрдПрд╕ | ╬Ф |
---|
рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб тШУ 1 | 60.00 | 4.21 | 14.3 |
рдереНрд░реЗрд╢реЛрд▓реНрдб тШУ 2 | 33.63 | 2.36 | 14.3 |
рдереНрд░реЗрд╢реЛрд▓реНрдб тШУ 100 | 1.45 | 0.05 | 28.7 |
GPUImage рдмрдирд╛рдо рдХреЛрд░ рдЫрд╡рд┐
рдХреЛрд░ рдЫрд╡рд┐ - рд▓рдЧрднрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдврд╛рдВрдЪрд╛ред рдпрд╣ ios 5 рдХреЗ рдмрд╛рдж рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╕реЗрдЯ рдирд╣реАрдВ рдерд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ), ios 6 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред рдХреЛрд░ рдЗрдореЗрдЬ рд╕реАрдкреАрдпреВ рдФрд░ рдЬреАрдкреАрдпреВ рджреЛрдиреЛрдВ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдХреЛрд░ рдЫрд╡рд┐ рдкрд░ GPUImage рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн:
- GPUImage рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ (рдмрдирд╛рдиреЗ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреЛрд░ рдЫрд╡рд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ OS X рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, iOS рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ);
- GPUImage рдХреЛрд░ рдЗрдореЗрдЬ рд╕реЗ рддреЗрдЬ рд╣реИ;
- GPUImage рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рдмрдЬрд╛рдп GLSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ;
- GPUImage рдУрдкрди рд╕реЛрд░реНрд╕ рд╣реИ;
GPUImage OpenGL рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг, рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдЖрдк рддреБрд░рдВрдд рдЕрдзрд┐рдХ рд░реЛрдорд╛рдВрдЪрдХ рдЪреАрдЬреЛрдВ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдирд╛, рдФрд░ рдЬрд▓реНрдж рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ!
GPUImage рд╕рдВрд░рдЪрдирд╛
GPUImage рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХрд╛ рдПрдХ рдЕрдореВрд░реНрддрди рд╣реИред рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рд╕реЗ рдЫрд╡рд┐рдпрд╛рдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ рдХреИрдорд░рд╛, рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛ рдбрд┐рд╕реНрдХ рд╣реЛ, рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЫрд╡рд┐ (UIImage) рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ, рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддрд┐рдкрд╛рджрди (GPUImageVIew рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред

рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ, GPUImage API рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рдХреИрдорд░рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╣реА рд╕рдВрдпреЛрдЬрди рдФрд░ рдереЛрдбрд╝реА рдХрд▓реНрдкрдирд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рдВрдЧ рдЕрдВрдзрд╛рдкрди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ
рд╕реНрддрд░ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ
рд░рдВрдЧ рд╕реНрддрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд░рдВрдЧ рдХрд╛ рд╕реНрддрд░GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; GPUImageFilter *filter = [[GPUImageLevelsFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; [filter setRedMin:0.299 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [filter setGreenMin:0.587 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [filter setBlueMin:0.114 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [videoCamera addTarget:filter]; GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:self.view.bounds)]; [filter addTarget:filteredVideoView]; [self.view addSubView:filteredVideoView]; [videoCamera startCameraCapture]
рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдРрдк рдЬреЛ GPUImage рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рдЧрднрдЧ 3.99 рдбреЙрд▓рд░ рдореЗрдВ Apple рд╕реНрдЯреЛрд░ рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдПрдХреАрдХрд░рдг рдФрд░ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдЖрдк рдХреАрдордд рдХреЗрд╡рд▓ $ 6.99 рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕ GPUImage
рдПрдХ shader GPU рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдПрдХ рдЪрд░рдг рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рд╢реАрд░реНрд╖ рд╢реАрд░реНрд╖ shaders рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд╣рдо рджреЛ-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред рдЫрд╡рд┐ рдПрдХ рд╡рд┐рдорд╛рди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рдЖрдпрдд рд╣реИред рдпрд╣ OpenGL рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рддреАрди-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕рдм рдХреБрдЫ рдореМрдЬреВрдж рд╣реИред рдпрджрд┐ рд╣рдо рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рд╕рддрд╣ рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдЬрд╣рд╛рдБ рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 2.0 рдХреЗрд╡рд▓ рддреНрд░рд┐рдХреЛрдг (рд╕рд╛рде рд╣реА рдЕрдВрдХ рдФрд░ рд░реЗрдЦрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдЖрдпрддрд╛рдХрд╛рд░ рдирд╣реАрдВ) рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдорд╛рди рджреЛ рддреНрд░рд┐рдХреЛрдгреЛрдВ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕ рд╡рди рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ GPUImage рдкрд░ рдорд╛рдирдХ рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реЗрдбрд░ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╡рд░реНрдЯреЗрдХреНрд╕ shader attribute vec4 position; attribute vec4 inputTextureCoordinate; varying vec2 textureCoordinate; void main() { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; }
рд╢реЗрдбрд░ рдХреЛ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ, рднрд┐рдиреНрдирддрд╛ рдФрд░ рд╡рд░реНрджреАред рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реНрдерд┐рддрд┐, рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдЖрдХреГрддрд┐ рдкрд░ рдмрдирд╛рд╡рдЯ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА), рд░рдВрдЧ, рд╕рд╛рдорд╛рдиреНрдп, рдЖрджрд┐ред
рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рд╢реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдз рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реЗрдбрд░ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдХреНрдпреЛрдВрдХрд┐ рдЯреБрдХрдбрд╝рд╛ рдЖрдХреГрддрд┐ рдкреВрд░реЗ рдЖрдВрдХрдбрд╝реЗ рдкрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ - рдпреЗ рдорд╛рди рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдХреГрддрд┐ рдХреЗ рдмрд╛рдПрдВ рдЖрдзреЗ рднрд╛рдЧ рдХреЗ рдХреЛрдиреЗ рд╕рдлреЗрдж рд╣реИрдВ рдФрд░ рджрд╛рд╣рд┐рдиреА рдЖрдзреА рдХрд╛рд▓реА рд╣реИ, рддреЛ рдЖрдХреГрддрд┐ рдХрд╛ рд░рдВрдЧ рд╕рдлреЗрдж рд╕реЗ рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рдПрдХ рдврд╛рд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред
рд╡рд░реНрджреА - рдЪрд░ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ (рдХрд╛рд░реНрдпрдХреНрд░рдо рдЦреБрдж) рдХреЗ рд╕рд╛рде shader рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рд╡реЗ рд╕рднреА рдХреЛрдиреЗ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВред
GPUImage рдореЗрдВ рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рджреЛ рд╕реЗрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ - рдпреЗ рд╡рд┐рдорд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗред
рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ
рд╡рд░реНрдЯреЗрдХрд░ рд╢реЗрдбрд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди
GPUImageFilter рд╡рд░реНрдЧ рд╕реЗ рдорд╛рдирдХ shader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдирдпрд╛ GPUImage рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
IPhone рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдлрд╝рд╛рдЗрд▓-> рдкреНрд░реЛрдЬреЗрдХреНрдЯ тЖТ рдПрдХрд▓ рджреГрд╢реНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧред рдЖрдк рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдФрд░ рдПрдЖрд░рд╕реА рдХреЛ рдЫреЛрдбрд╝ рдпрд╛ рдЕрдирдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╣рдорд╛рд░реА рдмрдирд╛рдИ рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ тЖТ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ)ред рдлрд┐рд░ рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдХреБрдЫ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рд╣рдореЗрдВ рдмрд╛рдХреА рд▓рд┐рдВрдХрд░ рдЭрдВрдбреЗ рдореЗрдВ -OjjC рдлреНрд▓реИрдЧ рдЬреЛрдбрд╝рдиреЗ рдФрд░ "рд╣реЗрдбрд░ рд╕рд░реНрдЪ рдкрд╛рдереНрд╕" рдореЗрдВ GPUImage рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд╣рдо рдПрдХ
рдзреНрд░реБрд╡реАрдп рдкрд┐рдХреНрд▓реЗрдЯреЗрдЯ рд╢реЗрдб рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЯреНрд╡рд┐рд╕реНрдЯрд┐рдВрдЧ рдФрд░
рдкреЛрд╕реНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдзреНрд░реБрд╡реАрдп рдкрд┐рдХреНрд╕реЗрд▓реЗрдЯ рдкреЛрд╕реНрдЯрд░ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ
рд╣рдорд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд░реБрд╡реАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ GPUImageFilter рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ GPUImagePolarPixellatePosterizeFilter рдХрд╣рддреЗ рд╣реИрдВред
GPUImageFilter #import "GPUImageFilter.h" @interface GPUImagePolarPixellateFilterPosertize : GPUImageFilter { GLint centerUniform, pixelSizeUniform; } // The center about which to apply the distortion, with a default of (0.5, 0.5) @property(readwrite, nonatomic) CGPoint center; // The amount of distortion to apply, from (-2.0, -2.0) to (2.0, 2.0), with a default of (0.05, 0.05) @property(readwrite, nonatomic) CGSize pixelSize; @end
рд╣рдо рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рджреЛ рд╕рдорд╛рди рдЪрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдВрдЯрд░ рдпреВрдиреАрдлреЙрд░реНрдо рд╡рд╣ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдВ рдзреНрд░реБрд╡реАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЙрддреНрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ 0.5, 0.5, рдЕрд░реНрдерд╛рддреН рд╕реНрдХреНрд░реАрди рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реИред OpenGL рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓реА 0.0 рд╕реЗ 0.0, 1.0 рд╕реЗ 1.0, рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред Pixellate рдорд╛рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж 'рдкрд┐рдХреНрд╕реЗрд▓' рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдзреНрд░реБрд╡реАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореВрд▓реНрдп "x" рддреНрд░рд┐рдЬреНрдпрд╛ ("рдХреЗрдВрджреНрд░" рд╕реЗ рджреВрд░реА) рд╣реИ, рдФрд░ рдЕрдиреНрдп рдорд╛рди рд░реЗрдбрд┐рдпрди рдореЗрдВ рдХреЛрдг рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ GPUImageFilter OpenGL рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдлреНрд░реЗрдордмрдлрд╝рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЦреБрдж рдХреЛ shader рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдорд╛рди рдЪрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ shader
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб NSString *const kGPUImagePolarPixellatePosterizeFragmentShaderString = SHADER_STRING ( varying highp vec2 textureCoordinate; uniform highp vec2 center; uniform highp vec2 pixelSize; uniform sampler2D inputImageTexture; void main() { highp vec2 normCoord = 2.0 * textureCoordinate - 1.0; highp vec2 normCenter = 2.0 * center - 1.0; normCoord -= normCenter; highp float r = length(normCoord);
Shader рдХреЛрдб рдореИрдХреНрд░реЛ SHADER_STRING () рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИ, рдЗрд╕реЗ NSString рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
GLSL рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ int, float, рд╡реЗрдХреНрдЯрд░ (vec2, vec3, vec4) рдФрд░ matrices (mat2, mat3, mat4) рд╣реИрдВред рдЖрдк рдореИрдЯреНрд░рд┐рд╕ рдФрд░ рд╡реИрдХреНрдЯрд░ рдкрд░ рд╕рд░рд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vec2 + vec2 рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рдВрдЦреНрдпрд╛ (рдЗрдВрдЯ рдпрд╛ рдлреНрд▓реЛрдЯ) рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдлреНрд▓реЛрдЯ * vec2 = vec2.x * рдлреНрд▓реЛрдЯ, vec2.y * рдлреНрд▓реЛрдЯред рдпрджрд┐ рдЖрдк vec3 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: vec4.xyzред рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА
рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА
рд╣реИ ред
рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ vec2 рдХреЗ рднрд┐рдиреНрди рдмрдирд╛рд╡рдЯ рдмрдирд╛рд╡рдЯ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЗрд▓реНрдбрд░ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИред рдпреВрдирд┐рдлрд╝реЙрд░реНрдо - рдХреЗрдВрджреНрд░ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░ рдЪрд░ - рд╡реЗ рдЪрд░ рд╣реИрдВ рдЬреЛ рд╣рдо рдЕрдкрдиреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд░реНрдЧ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдк sampler2D рдХрд╛ рдПрдХ рдЗрдирдкреБрдЯрдЗрдореЗрдЬрдЯреЗрдХреНрд╕реНрдЯ рдЪрд░ рд╣реИред рдпрд╣ рд╕рдорд╛рди рдЪрд░ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕, GPUImageFilter рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдЫрд╡рд┐ рдХреЗ рджреЛ-рдЖрдпрд╛рдореА рдмрдирд╛рд╡рдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рд╣рд╛рдИ рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рд╕реНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ GLSL рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛, рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд╕рд░рд▓ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдХрдо рд╕рдЯреАрдХрддрд╛ рд╕реНрдХреНрд░реАрди рдлрд┐рдЯ рд╣реЛрдЧреА, рдЬреЛ рдЖрдкрдХреЛ рдереЛрдбрд╝реА рддреЗрдЬреА рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕рдЯреАрдХрддрд╛ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд┐рдпрд░ lowp, mediump, highp рд╣реИрдВред рдЖрдк
рдпрд╣рд╛рдВ рд╕рдЯреАрдХрддрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рд╢реЗрдбрд░ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп () рд╣реЛрддрд╛ рд╣реИред рдЯреБрдХрдбрд╝рд╛ shader рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд░рдВрдЧ рд╣реИ рдЬреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд░рдВрдЧ рдореВрд▓ рдЫрд╡рд┐ рд╕реЗ normCoord рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдзреНрд░реБрд╡реАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓рдХрд░рдг рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣рдорд╛рд░реА рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдзреНрд░реБрд╡реАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╡рд╛рд▓реА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред TextureCoordinate рдЪрд░ 0.0, 0.0 рд╕реЗ 1.0, 1.0 рдХреЗ рдмреАрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдорд╛рди рдЪрд░ рдХреЗрдВрджреНрд░ рд╕рдорд╛рди рд╢реНрд░реЗрдгреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзреНрд░реБрд╡реАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ -1.0, -1.0 рд╕реЗ 1.0, 1.0 рддрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреА рд╣реИрдВред рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЗрдВрджреНрд░ рдорд╛рдирджрдВрдб рд╕реЗ рдШрдЯрддреА рд╣реИред рдпрд╛рдиреА рд╣рдордиреЗ рдмрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рдПрдХ рдирдП рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рд╣рдо рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдХреЛрдг phi рдХрд╛ рдорд╛рди рдкрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдЕрдкрдиреЗ рдкреВрд░реНрд╡ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ 0.0, 0.0 1.0, 1.0 рдХреА рд░реЗрдВрдЬ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдмрдирд╛рд╡рдЯ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреБрдирд╛рд╡рдЯ 2 рдбреА () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ: рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рдмрдирд╛рд╡рдЯ рд╡рд╕реНрддреБ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, inputImage) рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдмреБрдирд╛рд╡рдЯ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯрдЯреВ рдпреВ)ред
рдЕрдВрдд рдореЗрдВ, рд╣рдо рд▓рд╛рд▓, рд╣рд░рд╛, рдиреАрд▓рд╛ (рдФрд░ рдЕрд▓реНрдлрд╛ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рд╕рд░рдЧрдо тАЛтАЛрдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд▓реНрдлрд╛ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 1.0 рдЬреИрд╕рд╛ рд╣реИ ...) рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ (16.8 рдорд┐рд▓рд┐рдпрди рд░рдВрдЧреЛрдВ) рд╕реЗ 10 (1000 рд░рдВрдЧреЛрдВ) рдХреЗ рд▓рд┐рдП 256 рдорд╛рдиреЛрдВ рд╕реЗред ред
рдпрд╣ рд╣рдорд╛рд░рд╛ рдЯреБрдХрдбрд╝рд╛ shader рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рд╣реА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ (рд╕реАрдкреАрдпреВ) рдкрд░ рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, GPU рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡реАрдбрд┐рдпреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ CPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛
рдЬрдм рд╣рдордиреЗ shader рд▓рд┐рдЦрд╛, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬрд╝ рд╕рдорд╛рди рдЪрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕рдиреЗ рд╡рд╛рд▓реА рд╣реИред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рд╢реЗрд▓реНрдбрд░ рдХреЗ рдкрд╛рда рдХреЛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕рдорд░реВрдк рдЪрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
@ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб @synthesize center = _center; @synthesize pixelSize = _pixelSize; #pragma mark - #pragma mark Initialization and teardown - (id)init { if (!(self = [super initWithFragmentShaderFromString:kGPUImagePolarPixellatePosterizeFragmentShaderString])) { return nil; } pixelSizeUniform = [filterProgram uniformIndex:@"pixelSize"]; centerUniform = [filterProgram uniformIndex:@"center"]; self.pixelSize = CGSizeMake(0.05, 0.05); self.center = CGPointMake(0.5, 0.5); return self; }
рдЬрдм initWithFragmentShaderFromString рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реА рд╢реЗрдк рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ GPU рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛред рдпрджрд┐ рд╣рдо рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдПрдХ рд╣реА рдЪреБрдиреМрддреА рд╣реИред
рд╣рдореЗрдВ рдЕрдкрдиреЗ shader рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрджреА - рдЪрд░ рдХреЗ рд▓рд┐рдП [filterProgram рд╡рд░реНрджреАIndex:] рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рд╕рдорд╛рди рдЪрд░ рдХреЗ рд▓рд┐рдП Glint рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЪрд░ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЖрд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗред
рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рдорд╛рди рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ рдФрд░ рдЧреЗрдЯрд░реНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ:
рдХреЛрдб - (void)setPixelSize:(CGSize)pixelSize { _pixelSize = pixelSize; [self setSize:pixelSize forUniform: pixelSizeUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; [self setPoint:newValue forUniform: centerUniform program:filterProgram]; }
рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ
рдЕрдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реАрдбрд┐рдпреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВред рдЖрдЗрдП рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд░реНрдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдмрджрд▓реЗрдВ:
рдХреЛрдб #import "JGViewController.h" #import "GPUImage.h" #import "GPUImagePolarPixellatePosterizeFilter.h" @interface JGViewController () { GPUImageVideoCamera *vc; GPUImagePolarPixellatePosterizeFilter *ppf; } @end @implementation JGViewController - (void)viewDidLoad { [super viewDidLoad]; vc = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack ]; vc.outputImageOrientation = UIInterfaceOrientationPortrait; ppf = [[GPUImagePolarPixellatePosterizeFilter alloc] init]; [vc addTarget:ppf]; GPUImageView *v = [[GPUImageView alloc] init]; [ppf addTarget:v]; self.view = v; [vc startCameraCapture]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [[touches anyObject] locationInView:self.view]; CGSize pixelS = CGSizeMake(location.x / self.view.bounds.size.width * 0.5, location.y / self.view.bounds.size.height * 0.5); [ppf setPixelSize:pixelS]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [[touches anyObject] locationInView:self.view]; CGSize pixelS = CGSizeMake(location.x / self.view.bounds.size.width * 0.5, location.y / self.view.bounds.size.height * 0.5); [ppf setPixelSize:pixelS]; }
рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдФрд░ GPUImageVideoCamera рдФрд░ рд╣рдорд╛рд░реЗ GPUImagePolarPixellatePosterizeFilter рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
рдФрд░ GPUImageView рдХреЛ рд╣рдорд╛рд░реЗ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдореБрдЦреНрдп рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ: рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ - рдлрд╝рд┐рд▓реНрдЯрд░ pikselizatsii рдФрд░ рдкрд╛рд╕реНрдЪрд░рд╛рдЗрдЬреЗрд╢рди (polarpixellateposterizefilter) - GPUImageView, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдлреЛрди рд╕реНрдХреНрд░реАрди рдкрд░ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдлрд╝рд┐рд▓реНрдЯрд░ред рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдЯрдЪрд╕реНрдореЗрд╡реНрдб рдФрд░
рдЯрдЪрд╕реНрдмреЗрдЧрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд┐рдХ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рдорд╛рди рдпреВрдирд┐рдлрд╝реЙрд░реНрдо рдЪрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ 'рдкрд┐рдХреНрд╕реЗрд▓' рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЫрд╡рд┐ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВ, рдФрд░ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ - рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдореЗрдВред рдЕрдм рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрдзрд╛рдИ! рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ shader рд▓рд┐рдЦрд╛ рдерд╛!
рд╢реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
рдЫрд╡рд┐ рдореЗрдВ рд▓рд╛рд▓ рдФрд░ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдирд╛, рдиреАрд▓рд╛ рдмрдврд╝рд╛рдирд╛:
рдХреЛрдб lowp vec4 color = sampler2D(inputImageTexture, textureCoordinate); lowp vec4 alter = vec4(0.1, 0.5, 1.5, 1.0); gl_FragColor = color * alter;
рдЪрдордХ рдореЗрдВ рдХрдореА:
рдХреЛрдб lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4((textureColor.rgb + vec3(-0.5)), textureColor.w);
рд▓реЛрдХрдкреНрд░рд┐рдп рдЫрд╡рд┐ рдзреБрдВрдзрд▓рд╛:
рдХреЛрдб mediump float texelWidthOffset = 0.01; mediump float texelHeightOffset = 0.01; vec2 firstOffset = vec2(1.5 * texelWidthOffset, 1.5 * texelHeightOffset); vec2 secondOffset = vec2(3.5 * texelWidthOffset, 3.5 * texelHeightOffset); mediump oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset; mediump twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset; mediump oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset; mediump twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset; mediump vec4 fragmentColor = texture2D(inputImageTexture, inputTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2; fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2; gl_FragColor = fragmentColor;
GPUImage рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдкрдиреЗ рдореЗрдВ рджреЗрдЦреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рдореВрд░реНрдд рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, GPUImage рдлрд┐рд▓реНрдЯрд░, рд░рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рд╕рдореНрдорд┐рд╢реНрд░рдг рдореЛрдб рдФрд░ рджреГрд╢реНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдПрдХ рдЪрдХреНрдХрд░рджрд╛рд░ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рдХреЗрд╡рд▓ рд╕рдкрдиреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ)ред рдЖрдк рдЖрдзреБрдирд┐рдХ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХрд┐рдирд╛рд░реЗ рдХреА рдкрд╣рдЪрд╛рди, рдлрд┐рд╖реЗрдИ, рдФрд░ рдЕрдиреНрдп рдардВрдбреЗ рд╕рд╛рдорд╛рди рдХрд╛ рдПрдХ рдЯрди рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдбOpenGL ES 2.0 (GLSL) рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп:
рдПрдХ ,
рджреЛ ,
рддреАрди ред
рд▓реЗрдЦ рдЬреНрдЮрд╛рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдПрдХ рд░рдЪрдирд╛рддреНрдордХ рдЕрдиреБрдХреВрд▓рди рд╣реИ:
рд╕реНрд░реЛрдд 1 ,
рд╕реНрд░реЛрдд 2