我的要求是在位图上加载多个效果。我正在关注apply-effects-on-image-using-effects。我成功应用了效果,但我的要求是分别给出亮度效果。这意味着用户可以在应用任何其他效果后无需保存文件即可提供亮度效果。
我知道保存文件并再次渲染该文件后就可以了。但我需要它而不保存图像文件。
现在,如果我对任何应用效果应用亮度,则应用的效果消失,亮度显示其效果。这是因为下面的代码:
mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BRIGHTNESS);
此处, mEffect 始终初始化以对纹理赋予新效果。没有它,我无法加载效果。
所以,我的问题是,如何在不保存的情况下在同一纹理上加载多个效果。
答案 0 :(得分:2)
创建3个纹理,而不是2:
private int[] mTextures = new int[3];
private void loadTextures() {
// Generate textures
GLES20.glGenTextures(3, mTextures, 0);
...
之后,您可以依次应用两种效果:
private void applyEffect() {
if (mNeedSecondEffect) {
mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[2]);
mSecondEffect.apply(mTextures[2], mImageWidth, mImageHeight, mTextures[1]);
} else {
mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]);
}
}
使用2种纹理效果,您可以应用任意数量的效果级联,更改源和目标纹理。
编辑对于多重效果,请尝试以下操作:
让我们想象你有一系列效果级联
Effect mEffectArray[] = ...; // the effect objects to be applied
int mEffectCount = ... ; // number of effects used right now for output
然后您的 applyEffect()方法将是这样的:
private void applyEffect() {
if (mEffectCount > 0) { // if there is any effect
mEffectArray[0].apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]); // apply first effect
for (int i = 1; i < mEffectCount; i++) { // if more that one effect
int sourceTexture = mTextures[1];
int destinationTexture = mTextures[2];
mEffectArray[i].apply(sourceTexture, mImageWidth, mImageHeight, destinationTexture);
mTextures[1] = destinationTexture; // changing the textures array, so 1 is always the texture for output,
mTextures[2] = sourceTexture; // 2 is always the sparse texture
}
}
}