我们针对这个效果分析下实现的思路。
1.整个过程中视频是基于中心点进行放大缩小的。
fragmentShader实现效果如下
NSString *const kGLImageZoomFragmentShaderString = SHADER_STRING
(
precision highp float;
varying vec2 textureCoordinate;
uniform float scale;//放大缩小的比例值
uniform sampler2D inputImageTexture;
void main()
{
highp vec2 uv = textureCoordinate;
//uv坐标的中心点并非是(0.0,0.0),所以这里进行一次偏移,后面在偏移回来就可以了
vec2 center = vec2(0.5, 0.5);
uv -= center;
uv = uv / scale;
uv += center;
gl_FragColor = texture2D(inputImageTexture, uv);
}
);
整个过程中可以发现,是先放大缩小,然后原来尺寸上面停留几帧,然后重复上面的放大缩小的动作。用U表示上升,D表示下降,N表示无变化则整一个循环就应该是这样的
UUUPPPNNN, UUUPPPNNN, UUUPPPNNN....
详细看代码实现,这里不关着色器的事情,属于业务层的计算...
- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex{
[super newFrameReadyAtTime:frameTime atIndex:textureIndex];
self.currentFrameCount = self.currentFrameCount + 1;
if (self.currentFrameCount == kMaxResetCount) {
self.currentFrameCount =0;
}
if (self.currentFrameCount>=kMinResetCount) {
self.resetCount = self.resetCount + 12;
}else{
self.resetCount = self.resetCount - 12;
//不让缩到最小
if (self.resetCount<0) {
self.resetCount = 0;
}
}
//这里做放大的计算
NSInteger value = self.resetCount;
[self updateForegroundTexture:1.0+(value/100.0)];
}