From 8bad1ce5a72ec31cb2123505eff751cc053ad639 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Tue, 30 Jul 2019 15:43:32 +0530 Subject: [PATCH] implemented shader while taking picture and video --- .../otaliastudios/cameraview/CameraView.java | 2 +- .../cameraview/internal/egl/EglViewport.java | 41 +------------------ .../picture/SnapshotGlPictureRecorder.java | 7 +++- .../cameraview/preview/GlCameraPreview.java | 9 +++- .../preview/RendererFrameCallback.java | 4 +- .../shadereffects/effects/NoEffect.java | 8 ++-- .../video/SnapshotVideoRecorder.java | 12 ++++-- 7 files changed, 33 insertions(+), 50 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index bdbdf014..56605975 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -590,7 +590,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.BRIGHTNESS_EFFECT); + changeEffect(ShaderEffectFactory.ShaderEffects.SEPIA_EFFECT); } return true; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 3be83b2a..8cd225a5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -17,28 +17,6 @@ public class EglViewport extends EglElement { private final static CameraLogger LOG = CameraLogger.create(EglViewport.class.getSimpleName()); - // Simple vertex shader. - private static final String SIMPLE_VERTEX_SHADER = - "uniform mat4 uMVPMatrix;\n" + - "uniform mat4 uTexMatrix;\n" + - "attribute vec4 aPosition;\n" + - "attribute vec4 aTextureCoord;\n" + - "varying vec2 vTextureCoord;\n" + - "void main() {\n" + - " gl_Position = uMVPMatrix * aPosition;\n" + - " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + - "}\n"; - - // Simple fragment shader for use with external 2D textures - private static final String SIMPLE_FRAGMENT_SHADER = - "#extension GL_OES_EGL_image_external : require\n" + - "precision mediump float;\n" + - "varying vec2 vTextureCoord;\n" + - "uniform samplerExternalOES sTexture;\n" + - "void main() {\n" + - " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + - "}\n"; - // Stuff from Drawable2d.FULL_RECTANGLE // A full square, extending from -1 to +1 in both dimensions. // When the model/view/projection matrix is identity, this will exactly cover the viewport. @@ -76,15 +54,14 @@ public class EglViewport extends EglElement { // private int muTexOffsetLoc; // Used for filtering // private int muColorAdjustLoc; // Used for filtering - private String mVertexShader = SIMPLE_VERTEX_SHADER; - private String mFragmentShader = SIMPLE_FRAGMENT_SHADER; - private BaseShaderEffect mShaderEffect; private boolean mIsShaderChanged = false; public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + + //init the default shader effect mShaderEffect = new NoEffect(); initProgram(); } @@ -105,20 +82,6 @@ public class EglViewport extends EglElement { checkLocation(muMVPMatrixLocation, mShaderEffect.getMVPMatrixVariableName()); muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getTextureMatrixVariableName()); checkLocation(muTexMatrixLocation, mShaderEffect.getTextureMatrixVariableName()); - - - /*mProgramHandle = createProgram(mVertexShader, mFragmentShader); - - maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); - checkLocation(maPositionLocation, "aPosition"); - maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, "aTextureCoord"); - checkLocation(maTextureCoordLocation, "aTextureCoord"); - muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); - checkLocation(muMVPMatrixLocation, "uMVPMatrix"); - muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix"); - checkLocation(muTexMatrixLocation, "uTexMatrix");*/ - - // Stuff from Drawable2d.FULL_RECTANGLE } public void release(boolean doEglCleanup) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java index d13ef3a9..494e1f1a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java @@ -27,6 +27,7 @@ import com.otaliastudios.cameraview.internal.utils.WorkerHandler; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.RendererFrameCallback; import com.otaliastudios.cameraview.preview.RendererThread; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; @@ -99,7 +100,7 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { @RendererThread @Override - public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY) { + public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY, BaseShaderEffect shaderEffect) { mPreview.removeRendererFrameCallback(this); // This kinda work but has drawbacks: @@ -121,6 +122,10 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { // and draw the last frame again there. final EGLContext eglContext = EGL14.eglGetCurrentContext(); final EglCore core = new EglCore(eglContext, EglCore.FLAG_RECORDABLE); + + //set the current shader before taking the snapshot + mViewport.changeShaderEffect(shaderEffect); + // final EGLSurface oldSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_DRAW); // final EGLDisplay oldDisplay = EGL14.eglGetCurrentDisplay(); WorkerHandler.execute(new Runnable() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index 12ba0c79..77f1f061 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -16,6 +16,7 @@ import com.otaliastudios.cameraview.R; import com.otaliastudios.cameraview.internal.egl.EglViewport; import com.otaliastudios.cameraview.internal.utils.Op; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -69,6 +70,8 @@ public class GlCameraPreview extends CameraPreview