完整代码查看# AndroidShaderDemo下的SoulOutRender
灵魂出窍效果原理是图像分两层,第一层是底图,第二层覆盖第一层上,一边放大,一边淡化。前面实现了缩放特效,这次只需要再加上淡化动画就可以了。因为两层图像混合在一起,所以也用到了颜色混合,在GLSL里,颜色混合用glBlendFunc,改变源图像的Alpha值,就可以实现淡化动画效果。
SoulOutRender的onDrawFrame方法如下:
@Override
public void onDrawFrame(GL10 gl) {
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
float progress;
if (curFrame <= MaxFrame) {
progress = curFrame * 1.0f / MaxFrame;
} else {
curFrame = 0;
progress = 0;
}
float scale = 1f + progress * 0.3f;
float alpha = 0.3f - progress * 0.3f;
curFrame++;
drawLayer(1.0f,1.0f);
drawLayer(scale, alpha);
GLES20.glUseProgram(0);
glDisable(GL_BLEND);
}
首先打开颜色混合,然后计算缩放因子和淡化因子,之前在介绍缩放特效时说过,这里不重复了。然后调用drawLayer两次,画两个图层,一个是底层原大的,因此缩放因子是1,而且Alpha值是1。第二层赋予每帧的缩放因子和淡化因子,实现动画效果。
最终效果如下:
soul_out.gif
网友评论