Update FillLightFilter with onPreDraw

pull/535/head
Mattia Iavarone 6 years ago
parent fa6dfa1f2d
commit 2d7d73ab08
  1. 1
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java
  2. 93
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java

@ -123,6 +123,7 @@ public class DuotoneFilter extends BaseFilter {
Color.blue(mSecondColor) / 255f Color.blue(mSecondColor) / 255f
}; };
GLES20.glUniform3fv(mFirstColorLocation, 1, first, 0); GLES20.glUniform3fv(mFirstColorLocation, 1, first, 0);
GlUtils.checkError("glUniform3fv");
GLES20.glUniform3fv(mSecondColorLocation, 1, second, 0); GLES20.glUniform3fv(mSecondColorLocation, 1, second, 0);
GlUtils.checkError("glUniform3fv"); GlUtils.checkError("glUniform3fv");
} }

@ -1,15 +1,38 @@
package com.otaliastudios.cameraview.filters; package com.otaliastudios.cameraview.filters;
import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Applies back-light filling to the frames. * Applies back-light filling to the frames.
*/ */
public class FillLightFilter extends BaseFilter { public class FillLightFilter extends BaseFilter {
private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n"
+ "uniform samplerExternalOES sTexture;\n"
+ "uniform float mult;\n"
+ "uniform float igamma;\n"
+ "varying vec2 vTextureCoord;\n"
+ "void main() {\n"
+ " const vec3 color_weights = vec3(0.25, 0.5, 0.25);\n"
+ " vec4 color = texture2D(sTexture, vTextureCoord);\n"
+ " float lightmask = dot(color.rgb, color_weights);\n"
+ " float backmask = (1.0 - lightmask);\n"
+ " vec3 ones = vec3(1.0, 1.0, 1.0);\n"
+ " vec3 diff = pow(mult * color.rgb, igamma * ones) - color.rgb;\n"
+ " diff = min(diff, 1.0);\n"
+ " vec3 new_color = min(color.rgb + diff * backmask, 1.0);\n"
+ " gl_FragColor = vec4(new_color, color.a);\n"
+ "}\n";
private float strength = 0.5f; private float strength = 0.5f;
private int multiplierLocation = -1;
private int gammaLocation = -1;
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public FillLightFilter() { } public FillLightFilter() { }
@ -39,45 +62,49 @@ public class FillLightFilter extends BaseFilter {
return strength; return strength;
} }
@Override
protected BaseFilter onCopy() {
FillLightFilter filter = new FillLightFilter();
filter.setStrength(getStrength());
return filter;
}
@NonNull @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
float fade_gamma = 0.3f; return FRAGMENT_SHADER;
float amt = 1.0f - strength; }
float mult = 1.0f / (amt * 0.7f + 0.3f);
float faded = fade_gamma + (1.0f - fade_gamma) * mult;
float igamma = 1.0f / faded;
String multString = "mult = " + mult + ";\n"; @Override
String igammaString = "igamma = " + igamma + ";\n"; public void onCreate(int programHandle) {
super.onCreate(programHandle);
multiplierLocation = GLES20.glGetUniformLocation(programHandle, "mult");
GlUtils.checkLocation(multiplierLocation, "mult");
gammaLocation = GLES20.glGetUniformLocation(programHandle, "igamma");
GlUtils.checkLocation(gammaLocation, "igamma");
}
return "#extension GL_OES_EGL_image_external : require\n" @Override
+ "precision mediump float;\n" public void onDestroy() {
+ "uniform samplerExternalOES sTexture;\n" super.onDestroy();
+ " float mult;\n" multiplierLocation = -1;
+ " float igamma;\n" gammaLocation = -1;
+ "varying vec2 vTextureCoord;\n" }
+ "void main() {\n"
// Parameters that were created above @Override
+ multString protected void onPreDraw(float[] transformMatrix) {
+ igammaString super.onPreDraw(transformMatrix);
+ " const vec3 color_weights = vec3(0.25, 0.5, 0.25);\n" float amount = 1.0f - strength;
+ " vec4 color = texture2D(sTexture, vTextureCoord);\n" float multiplier = 1.0f / (amount * 0.7f + 0.3f);
+ " float lightmask = dot(color.rgb, color_weights);\n" GLES20.glUniform1f(multiplierLocation, multiplier);
+ " float backmask = (1.0 - lightmask);\n" GlUtils.checkError("glUniform1f");
+ " vec3 ones = vec3(1.0, 1.0, 1.0);\n"
+ " vec3 diff = pow(mult * color.rgb, igamma * ones) - color.rgb;\n" float fadeGamma = 0.3f;
+ " diff = min(diff, 1.0);\n" float faded = fadeGamma + (1.0f - fadeGamma) * multiplier;
+ " vec3 new_color = min(color.rgb + diff * backmask, 1.0);\n" float gamma = 1.0f / faded;
+ " gl_FragColor = vec4(new_color, color.a);\n" GLES20.glUniform1f(gammaLocation, gamma);
+ "}\n"; GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
FillLightFilter filter = new FillLightFilter();
filter.setStrength(getStrength());
return filter;
}
} }

Loading…
Cancel
Save