parent
1dcc4e6c22
commit
443eb22514
@ -0,0 +1,309 @@ |
|||||||
|
|
||||||
|
package com.frank.live; |
||||||
|
|
||||||
|
import android.Manifest; |
||||||
|
import android.annotation.TargetApi; |
||||||
|
import android.app.Activity; |
||||||
|
import android.content.res.Configuration; |
||||||
|
import android.graphics.Bitmap; |
||||||
|
import android.hardware.Camera; |
||||||
|
import android.os.Bundle; |
||||||
|
import android.os.Environment; |
||||||
|
import android.support.annotation.NonNull; |
||||||
|
import android.util.Log; |
||||||
|
import android.view.SurfaceHolder; |
||||||
|
import android.view.SurfaceHolder.Callback; |
||||||
|
import android.view.View; |
||||||
|
import android.view.View.OnClickListener; |
||||||
|
import android.view.WindowManager; |
||||||
|
import android.widget.AdapterView; |
||||||
|
import android.widget.AdapterView.OnItemSelectedListener; |
||||||
|
import android.widget.ArrayAdapter; |
||||||
|
import android.widget.Button; |
||||||
|
import android.widget.ImageView; |
||||||
|
import android.widget.Spinner; |
||||||
|
|
||||||
|
import com.frank.live.view.SmartCameraView; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class PushActivity extends Activity implements Callback { |
||||||
|
private static String TAG = PushActivity.class.getSimpleName(); |
||||||
|
|
||||||
|
private SmartCameraView mSmartCameraView; |
||||||
|
|
||||||
|
// MagicFilterType magicType = MagicFilterType.SUNRISE;
|
||||||
|
|
||||||
|
private Button btnMute; |
||||||
|
|
||||||
|
private boolean isStart = false; |
||||||
|
|
||||||
|
private boolean is_mute = false; |
||||||
|
|
||||||
|
private int mDegree; |
||||||
|
|
||||||
|
private Spinner beautyTypeSelector; |
||||||
|
|
||||||
|
private ImageView img_photo; |
||||||
|
//拍照
|
||||||
|
private boolean takePhoto; |
||||||
|
|
||||||
|
private final static int videoWidth = 640; |
||||||
|
private final static int videoHeight = 360; |
||||||
|
private final static String[] permissions = new String[]{Manifest.permission.CAMERA}; |
||||||
|
private final static int CODE_CAMERA = 1001; |
||||||
|
|
||||||
|
private final static String[] beautySelector = new String[]{"美颜", "冷酷", "日出","素描","白猫", "浪漫", "原图"}; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onCreate(Bundle savedInstanceState) { |
||||||
|
|
||||||
|
super.onCreate(savedInstanceState); |
||||||
|
|
||||||
|
requestPermissions(); |
||||||
|
|
||||||
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
||||||
|
|
||||||
|
setContentView(R.layout.activity_push); |
||||||
|
|
||||||
|
initView(); |
||||||
|
initListener(); |
||||||
|
} |
||||||
|
|
||||||
|
@TargetApi(23) |
||||||
|
private void requestPermissions(){ |
||||||
|
requestPermissions(permissions, CODE_CAMERA); |
||||||
|
} |
||||||
|
|
||||||
|
private void initView(){ |
||||||
|
//SurfaceView
|
||||||
|
mSmartCameraView = (SmartCameraView) findViewById(R.id.gl_surfaceview); |
||||||
|
//美颜类型
|
||||||
|
beautyTypeSelector = (Spinner) findViewById(R.id.beauty_type_selctor); |
||||||
|
//静音
|
||||||
|
btnMute = (Button) findViewById(R.id.button_mute); |
||||||
|
//拍照
|
||||||
|
img_photo = (ImageView) findViewById(R.id.img_photo); |
||||||
|
} |
||||||
|
|
||||||
|
private void initListener(){ |
||||||
|
|
||||||
|
ArrayAdapter<String> adapterBeautyType = new ArrayAdapter<>(this, |
||||||
|
android.R.layout.simple_spinner_item, beautySelector); |
||||||
|
adapterBeautyType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); |
||||||
|
beautyTypeSelector.setAdapter(adapterBeautyType); |
||||||
|
beautyTypeSelector.setOnItemSelectedListener(new OnItemSelectedListener() { |
||||||
|
@Override |
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { |
||||||
|
|
||||||
|
switch (position){ |
||||||
|
case 0: |
||||||
|
switchCameraFilter(MagicFilterType.BEAUTY); |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
switchCameraFilter(MagicFilterType.COOL); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
switchCameraFilter(MagicFilterType.SUNRISE); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
switchCameraFilter(MagicFilterType.SKETCH); |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
switchCameraFilter(MagicFilterType.WHITECAT); |
||||||
|
break; |
||||||
|
case 5: |
||||||
|
switchCameraFilter(MagicFilterType.ROMANCE); |
||||||
|
break; |
||||||
|
default: |
||||||
|
switchCameraFilter(MagicFilterType.NONE); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void onNothingSelected(AdapterView<?> parent) { |
||||||
|
|
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
btnMute.setOnClickListener(new OnClickListener() { |
||||||
|
@Override |
||||||
|
public void onClick(View view) { |
||||||
|
is_mute = !is_mute; |
||||||
|
|
||||||
|
if ( is_mute ) |
||||||
|
btnMute.setText("取消静音"); |
||||||
|
else |
||||||
|
btnMute.setText("静音"); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
//预览数据回调(RGBA格式)
|
||||||
|
mSmartCameraView.setPreviewCallback(new SmartCameraView.PreviewCallback() { |
||||||
|
@Override |
||||||
|
public void onGetRgbaFrame(byte[] data, int width, int height) { |
||||||
|
|
||||||
|
if(takePhoto){ |
||||||
|
takePhoto = false; |
||||||
|
Log.i(TAG, "takePhoto..."); |
||||||
|
doTakePhoto(data, width, height); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
img_photo.setOnClickListener(new OnClickListener() { |
||||||
|
@Override |
||||||
|
public void onClick(View view) { |
||||||
|
takePhoto = true; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private void switchCameraFilter(MagicFilterType type) { |
||||||
|
mSmartCameraView.setFilter(type); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 拍照 |
||||||
|
* @param data 预览数据 |
||||||
|
* @param width 图片宽度 |
||||||
|
* @param height 图片高度 |
||||||
|
*/ |
||||||
|
private void doTakePhoto(byte[] data, int width, int height){ |
||||||
|
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(data); |
||||||
|
bitmap.copyPixelsFromBuffer(buffer); |
||||||
|
|
||||||
|
Log.i(TAG, "doTakePhoto..."); |
||||||
|
FileOutputStream fileOutputStream = null; |
||||||
|
String PATH = Environment.getExternalStorageDirectory().getPath(); |
||||||
|
String filePath = PATH + File.separator + "hello_openGL" + ".jpg"; |
||||||
|
try { |
||||||
|
fileOutputStream = new FileOutputStream(filePath); |
||||||
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); |
||||||
|
fileOutputStream.flush(); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
Log.e(TAG, "doTakePhoto error=" + e.toString()); |
||||||
|
}finally { |
||||||
|
if(fileOutputStream != null){ |
||||||
|
try { |
||||||
|
fileOutputStream.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void surfaceCreated(SurfaceHolder holder) { |
||||||
|
Log.i(TAG, "surfaceCreated.."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
||||||
|
Log.i(TAG, "surfaceChanged.."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void surfaceDestroyed(SurfaceHolder holder) { |
||||||
|
// TODO Auto-generated method stub
|
||||||
|
Log.i(TAG, "Surface Destroyed"); |
||||||
|
} |
||||||
|
|
||||||
|
public void onConfigurationChanged(Configuration newConfig) { |
||||||
|
try { |
||||||
|
super.onConfigurationChanged(newConfig); |
||||||
|
Log.i(TAG, "onConfigurationChanged, start:" + isStart); |
||||||
|
|
||||||
|
setCameraDisplayOrientation(this, getCameraId()); |
||||||
|
|
||||||
|
mSmartCameraView.setPreviewOrientation(newConfig.orientation, mDegree); |
||||||
|
|
||||||
|
} catch (Exception ex) { |
||||||
|
Log.e(TAG, "error="+ex.toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private int getCameraId() { |
||||||
|
return mSmartCameraView.getCameraId(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setPreviewResolution(int width, int height) { |
||||||
|
mSmartCameraView.setPreviewResolution(width, height); |
||||||
|
} |
||||||
|
|
||||||
|
private void setCameraDisplayOrientation (Activity activity, int cameraId) { |
||||||
|
Camera.CameraInfo info = new Camera.CameraInfo(); |
||||||
|
Camera.getCameraInfo (cameraId , info); |
||||||
|
int rotation = activity.getWindowManager ().getDefaultDisplay ().getRotation (); |
||||||
|
int degrees = 0; |
||||||
|
switch (rotation) { |
||||||
|
case 0: |
||||||
|
degrees = 0; |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
degrees = 90; |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
degrees = 180; |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
degrees = 270; |
||||||
|
break; |
||||||
|
} |
||||||
|
int result; |
||||||
|
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { |
||||||
|
result = (info.orientation + degrees) % 360; |
||||||
|
result = (360 - result) % 360; |
||||||
|
} else { |
||||||
|
// back-facing
|
||||||
|
result = ( info.orientation - degrees + 360) % 360; |
||||||
|
} |
||||||
|
|
||||||
|
Log.i(TAG, "curDegree: "+ result); |
||||||
|
|
||||||
|
mDegree = result; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
Log.i(TAG, "activity destory!"); |
||||||
|
|
||||||
|
if ( isStart ) { |
||||||
|
isStart = false; |
||||||
|
if(mSmartCameraView != null) |
||||||
|
{ |
||||||
|
mSmartCameraView.stopCamera(); |
||||||
|
} |
||||||
|
|
||||||
|
Log.i(TAG, "onDestroy StopPublish"); |
||||||
|
} |
||||||
|
|
||||||
|
super.onDestroy(); |
||||||
|
finish(); |
||||||
|
System.exit(0); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { |
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults); |
||||||
|
if(permissions.length > 0 && grantResults.length > 0){ |
||||||
|
Log.i(TAG, "permission=" + permissions[0] + "----grantResult=" + grantResults[0]); |
||||||
|
|
||||||
|
setPreviewResolution(videoWidth, videoHeight); |
||||||
|
|
||||||
|
if (!mSmartCameraView.startCamera()) { |
||||||
|
Log.e(TAG, "startCamera error..."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,372 @@ |
|||||||
|
package com.frank.live.view; |
||||||
|
|
||||||
|
import android.content.Context; |
||||||
|
import android.content.res.Configuration; |
||||||
|
import android.graphics.ImageFormat; |
||||||
|
import android.graphics.SurfaceTexture; |
||||||
|
import android.hardware.Camera; |
||||||
|
import android.opengl.GLES20; |
||||||
|
import android.opengl.GLSurfaceView; |
||||||
|
import android.opengl.Matrix; |
||||||
|
import android.util.AttributeSet; |
||||||
|
import android.util.Log; |
||||||
|
|
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterFactory; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.ByteBuffer; |
||||||
|
import java.nio.IntBuffer; |
||||||
|
import java.util.List; |
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue; |
||||||
|
|
||||||
|
import javax.microedition.khronos.egl.EGLConfig; |
||||||
|
import javax.microedition.khronos.opengles.GL10; |
||||||
|
|
||||||
|
public class SmartCameraView extends GLSurfaceView implements GLSurfaceView.Renderer { |
||||||
|
|
||||||
|
private GPUImageFilter magicFilter; |
||||||
|
private SurfaceTexture surfaceTexture; |
||||||
|
private int mOESTextureId = OpenGLUtils.NO_TEXTURE; |
||||||
|
private int mSurfaceWidth; |
||||||
|
private int mSurfaceHeight; |
||||||
|
private int mPreviewWidth; |
||||||
|
private int mPreviewHeight; |
||||||
|
|
||||||
|
private float mInputAspectRatio; |
||||||
|
private float mOutputAspectRatio; |
||||||
|
private float[] mProjectionMatrix = new float[16]; |
||||||
|
private float[] mSurfaceMatrix = new float[16]; |
||||||
|
private float[] mTransformMatrix = new float[16]; |
||||||
|
|
||||||
|
private Camera mCamera; |
||||||
|
private ByteBuffer mGLPreviewBuffer; |
||||||
|
private int mCamId = -1; |
||||||
|
private int mPreviewRotation = 0; |
||||||
|
private int mPreviewOrientation = Configuration.ORIENTATION_PORTRAIT; |
||||||
|
|
||||||
|
private Thread worker; |
||||||
|
private final Object writeLock = new Object(); |
||||||
|
private ConcurrentLinkedQueue<IntBuffer> mGLIntBufferCache = new ConcurrentLinkedQueue<>(); |
||||||
|
private PreviewCallback mPrevCb; |
||||||
|
|
||||||
|
private final String TAG = "SmartCameraView"; |
||||||
|
|
||||||
|
public SmartCameraView(Context context) { |
||||||
|
this(context, null); |
||||||
|
} |
||||||
|
|
||||||
|
public SmartCameraView(Context context, AttributeSet attrs) { |
||||||
|
super(context, attrs); |
||||||
|
|
||||||
|
setEGLContextClientVersion(2); |
||||||
|
setRenderer(this); |
||||||
|
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onSurfaceCreated(GL10 gl, EGLConfig config) { |
||||||
|
Log.e(TAG, "Run into onSurfaceCreated..."); |
||||||
|
|
||||||
|
GLES20.glDisable(GL10.GL_DITHER); |
||||||
|
GLES20.glClearColor(0, 0, 0, 0); |
||||||
|
|
||||||
|
magicFilter = new GPUImageFilter(MagicFilterType.NONE); |
||||||
|
magicFilter.init(getContext().getApplicationContext()); |
||||||
|
magicFilter.onInputSizeChanged(mPreviewWidth, mPreviewHeight); |
||||||
|
|
||||||
|
mOESTextureId = OpenGLUtils.getExternalOESTextureID(); |
||||||
|
|
||||||
|
surfaceTexture = new SurfaceTexture(mOESTextureId); |
||||||
|
surfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() { |
||||||
|
@Override |
||||||
|
public void onFrameAvailable(SurfaceTexture surfaceTexture) { |
||||||
|
requestRender(); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
// For camera preview on activity creation
|
||||||
|
if (mCamera != null) { |
||||||
|
try { |
||||||
|
mCamera.setPreviewTexture(surfaceTexture); |
||||||
|
} catch (IOException ioe) { |
||||||
|
ioe.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Log.i(TAG, "Run out of onSurfaceCreated..."); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onSurfaceChanged(GL10 gl, int width, int height) { |
||||||
|
Log.i(TAG, "Run into onSurfaceChanged...width: " + width + ", height: " + height); |
||||||
|
GLES20.glViewport(0, 0, width, height); |
||||||
|
mSurfaceWidth = width; |
||||||
|
mSurfaceHeight = height; |
||||||
|
magicFilter.onDisplaySizeChanged(width, height); |
||||||
|
|
||||||
|
mOutputAspectRatio = width > height ? (float) width / height : (float) height / width; |
||||||
|
float aspectRatio = mOutputAspectRatio / mInputAspectRatio; |
||||||
|
|
||||||
|
if (width > height) { |
||||||
|
Matrix.orthoM(mProjectionMatrix, 0, -1.0f, 1.0f, -aspectRatio, aspectRatio, -1.0f, 1.0f); |
||||||
|
} else { |
||||||
|
Matrix.orthoM(mProjectionMatrix, 0, -aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f); |
||||||
|
} |
||||||
|
|
||||||
|
Log.i(TAG, "Run out onSurfaceChanged--"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDrawFrame(GL10 gl) { |
||||||
|
|
||||||
|
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
||||||
|
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); |
||||||
|
|
||||||
|
surfaceTexture.updateTexImage(); |
||||||
|
|
||||||
|
surfaceTexture.getTransformMatrix(mSurfaceMatrix); |
||||||
|
|
||||||
|
Matrix.multiplyMM(mTransformMatrix, 0, mSurfaceMatrix, 0, mProjectionMatrix, 0); |
||||||
|
magicFilter.setTextureTransformMatrix(mTransformMatrix); |
||||||
|
|
||||||
|
magicFilter.onDrawFrame(mOESTextureId); |
||||||
|
|
||||||
|
mGLIntBufferCache.add(magicFilter.getGLFboBuffer()); |
||||||
|
synchronized (writeLock) { |
||||||
|
writeLock.notifyAll(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setPreviewCallback(PreviewCallback cb) { |
||||||
|
mPrevCb = cb; |
||||||
|
} |
||||||
|
|
||||||
|
public int[] setPreviewResolution(int width, int height) { |
||||||
|
getHolder().setFixedSize(width, height); |
||||||
|
|
||||||
|
mCamera = openCamera(); |
||||||
|
mPreviewWidth = width; |
||||||
|
mPreviewHeight = height; |
||||||
|
|
||||||
|
mCamera.getParameters().setPreviewSize(mPreviewWidth, mPreviewHeight); |
||||||
|
|
||||||
|
mGLPreviewBuffer = ByteBuffer.allocate(mPreviewWidth * mPreviewHeight * 4); |
||||||
|
|
||||||
|
mInputAspectRatio = mPreviewWidth > mPreviewHeight ? |
||||||
|
(float) mPreviewWidth / mPreviewHeight : (float) mPreviewHeight / mPreviewWidth; |
||||||
|
|
||||||
|
return new int[] { mPreviewWidth, mPreviewHeight }; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean setFilter(final MagicFilterType type) { |
||||||
|
if (mCamera == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
queueEvent(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
if (magicFilter != null) { |
||||||
|
magicFilter.destroy(); |
||||||
|
} |
||||||
|
magicFilter = MagicFilterFactory.initFilters(type); |
||||||
|
if (magicFilter != null) { |
||||||
|
magicFilter.init(getContext().getApplicationContext()); |
||||||
|
magicFilter.onInputSizeChanged(mPreviewWidth, mPreviewHeight); |
||||||
|
magicFilter.onDisplaySizeChanged(mSurfaceWidth, mSurfaceHeight); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
requestRender(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
private void deleteTextures() { |
||||||
|
if (mOESTextureId != OpenGLUtils.NO_TEXTURE) { |
||||||
|
queueEvent(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glDeleteTextures(1, new int[]{ mOESTextureId }, 0); |
||||||
|
mOESTextureId = OpenGLUtils.NO_TEXTURE; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setCameraId(int id) { |
||||||
|
mCamId = id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setPreviewOrientation(int orientation, int degree) { |
||||||
|
mPreviewOrientation = orientation; |
||||||
|
mPreviewRotation = degree; |
||||||
|
|
||||||
|
mCamera.setDisplayOrientation(degree); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public int getCameraId() { |
||||||
|
return mCamId; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean startCamera() { |
||||||
|
worker = new Thread(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
while (!Thread.interrupted()) { |
||||||
|
while (!mGLIntBufferCache.isEmpty()) { |
||||||
|
IntBuffer picture = mGLIntBufferCache.poll(); |
||||||
|
mGLPreviewBuffer.asIntBuffer().put(picture.array()); |
||||||
|
mPrevCb.onGetRgbaFrame(mGLPreviewBuffer.array(), mPreviewWidth, mPreviewHeight); |
||||||
|
} |
||||||
|
// Waiting for next frame
|
||||||
|
synchronized (writeLock) { |
||||||
|
try { |
||||||
|
// isEmpty() may take some time, so we set timeout to detect next frame
|
||||||
|
writeLock.wait(500); |
||||||
|
} catch (InterruptedException ie) { |
||||||
|
worker.interrupt(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
worker.start(); |
||||||
|
|
||||||
|
if (mCamera == null) { |
||||||
|
mCamera = openCamera(); |
||||||
|
if (mCamera == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Camera.Parameters params = mCamera.getParameters(); |
||||||
|
|
||||||
|
List<String> supportedFocusModes = params.getSupportedFocusModes(); |
||||||
|
if (!supportedFocusModes.isEmpty()) { |
||||||
|
if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { |
||||||
|
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); |
||||||
|
} else { |
||||||
|
params.setFocusMode(supportedFocusModes.get(0)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
params.setPictureSize(mPreviewWidth, mPreviewHeight); |
||||||
|
params.setPreviewSize(mPreviewWidth, mPreviewHeight); |
||||||
|
|
||||||
|
int VFPS = 15; |
||||||
|
int[] range = adaptFpsRange(VFPS, params.getSupportedPreviewFpsRange()); |
||||||
|
params.setPreviewFpsRange(range[0], range[1]); |
||||||
|
params.setPreviewFormat(ImageFormat.NV21); |
||||||
|
|
||||||
|
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); |
||||||
|
params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO); |
||||||
|
params.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO); |
||||||
|
if (!params.getSupportedFocusModes().isEmpty()) { |
||||||
|
params.setFocusMode(params.getSupportedFocusModes().get(0)); |
||||||
|
} |
||||||
|
mCamera.setParameters(params); |
||||||
|
|
||||||
|
mCamera.setDisplayOrientation(mPreviewRotation); |
||||||
|
|
||||||
|
try { |
||||||
|
mCamera.setPreviewTexture(surfaceTexture); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
GetParameters(mCamera); |
||||||
|
|
||||||
|
mCamera.startPreview(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public void stopCamera() { |
||||||
|
if (worker != null) { |
||||||
|
worker.interrupt(); |
||||||
|
try { |
||||||
|
worker.join(); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
worker.interrupt(); |
||||||
|
} |
||||||
|
mGLIntBufferCache.clear(); |
||||||
|
worker = null; |
||||||
|
} |
||||||
|
|
||||||
|
if (mCamera != null) { |
||||||
|
mCamera.stopPreview(); |
||||||
|
mCamera.release(); |
||||||
|
mCamera = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void GetParameters(Camera camera) { |
||||||
|
List<Camera.Size> pictureSizes = camera.getParameters().getSupportedPictureSizes(); |
||||||
|
List<Camera.Size> previewSizes = camera.getParameters().getSupportedPreviewSizes(); |
||||||
|
Camera.Size psize; |
||||||
|
for (int i = 0; i < pictureSizes.size(); i++) { |
||||||
|
psize = pictureSizes.get(i); |
||||||
|
Log.i(TAG,psize.width+" x "+psize.height); |
||||||
|
} |
||||||
|
for (int i = 0; i < previewSizes.size(); i++) { |
||||||
|
psize = previewSizes.get(i); |
||||||
|
Log.i(TAG,psize.width+" x "+psize.height); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Camera openCamera() { |
||||||
|
Camera camera; |
||||||
|
if (mCamId < 0) { |
||||||
|
Camera.CameraInfo info = new Camera.CameraInfo(); |
||||||
|
|
||||||
|
int numCameras = Camera.getNumberOfCameras(); |
||||||
|
int frontCamId = -1; |
||||||
|
int backCamId = -1; |
||||||
|
for (int i = 0; i < numCameras; i++) { |
||||||
|
Camera.getCameraInfo(i, info); |
||||||
|
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { |
||||||
|
backCamId = i; |
||||||
|
} else if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { |
||||||
|
frontCamId = i; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
if (frontCamId != -1) { |
||||||
|
mCamId = frontCamId; |
||||||
|
} else if (backCamId != -1) { |
||||||
|
mCamId = backCamId; |
||||||
|
} else { |
||||||
|
mCamId = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
camera = Camera.open(mCamId); |
||||||
|
|
||||||
|
return camera; |
||||||
|
} |
||||||
|
|
||||||
|
private int[] adaptFpsRange(int expectedFps, List<int[]> fpsRanges) { |
||||||
|
expectedFps *= 1000; |
||||||
|
int[] closestRange = fpsRanges.get(0); |
||||||
|
int measure = Math.abs(closestRange[0] - expectedFps) + Math.abs(closestRange[1] - expectedFps); |
||||||
|
for (int[] range : fpsRanges) { |
||||||
|
if (range[0] <= expectedFps && range[1] >= expectedFps) { |
||||||
|
int curMeasure = Math.abs(range[0] - expectedFps) + Math.abs(range[1] - expectedFps); |
||||||
|
if (curMeasure < measure) { |
||||||
|
closestRange = range; |
||||||
|
measure = curMeasure; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return closestRange; |
||||||
|
} |
||||||
|
|
||||||
|
public interface PreviewCallback { |
||||||
|
|
||||||
|
void onGetRgbaFrame(byte[] data, int width, int height); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicAmaroFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicAmaroFilter(){ |
||||||
|
super(MagicFilterType.AMARO, R.raw.amaro); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for (int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_blowout.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/overlaymap.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/amaromap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,87 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicAntiqueFilter extends GPUImageFilter{ |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicAntiqueFilter(){ |
||||||
|
super(MagicFilterType.ANTIQUE, R.raw.antique); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
this.mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (this.mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (this.mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(this.mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 102, 103, 104, 106, 107, 108, 110, 111, 112, 114, 115, 116, 118, 119, 120, 122, 123, 124, 126, 127, 128, 130, 131, 132, 134, 135, 136, 137, 139, 140, 141, 143, 144, 145, 146, 148, 149, 150, 152, 153, 154, 155, 157, 158, 159, 160, 161, 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 247, 247, 248, 248, 249, 249, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 15, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 55, 56, 57, 57, 58, 59, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 85, 86, 87, 87, 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 102, 102, 103, 104, 106, 107, 108, 110, 111, 112, 114, 115, 116, 118, 118, 119, 120, 122, 123, 124, 126, 127, 128, 130, 131, 132, 134, 134, 135, 136, 137, 139, 140, 141, 143, 144, 145, 146, 148, 149, 149, 150, 152, 153, 154, 155, 157, 158, 159, 160, 161, 163, 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, 175, 176, 177, 177, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 222, 223, 223, 224, 225, 226, 226, 227, 228, 228, 229, 230, 230, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 245, 246, 247, 247, 248, 248, 249, 249, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 87, 89, 89, 90, 90, 91, 91, 93, 93, 94, 95, 95, 96, 96, 98, 98, 99, 100, 100, 102, 102, 103, 103, 104, 104, 106, 107, 107, 108, 108, 110, 110, 111, 112, 112, 114, 114, 115, 115, 116, 118, 118, 119, 119, 120, 120, 122, 123, 123, 124, 124, 126, 126, 127, 128, 128, 130, 130, 131, 131, 132, 134, 134, 135, 135, 136, 136, 137, 139, 139, 140, 140, 141, 143, 143, 144, 144, 145, 146, 146, 148, 148, 149, 150, 150, 152, 152, 153, 154, 154, 155, 155, 157, 158, 158, 159, 159, 160, 161, 161, 163, 163, 164, 165, 165, 166, 168, 168, 169, 169, 170, 171, 171, 172, 173, 173, 175, 175, 176, 177, 177, 178, 179, 179, 180, 181, 181, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 210, 211, 211, 211, 212, 212, 213, 214, 215, 215, 216, 216, 217, 217, 218, 219, 219, 220, 220, 221, 221, 222, 223, 223, 223, 224, 225, 226, 226, 226, 227, 228, 228, 228, 229, 230, 230, 230, 231, 232, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 242, 243, 244, 244, 244, 245, 245, 246, 247, 247, 247, 248, 248, 249, 249, 249, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 78, 79, 80, 81, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 97, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 113, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126, 127, 129, 130, 131, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146, 148, 149, 150, 152, 153, 154, 156, 157, 158, 159, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 175, 176, 177, 178, 180, 181, 182, 183, 184, 186, 187, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 213, 214, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 227, 228, 229, 230, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 245, 246, 247, 247, 248, 248, 249, 250, 250, 251, 251, 252, 253, 253, 254, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by Administrator on 2016/5/22. |
||||||
|
*/ |
||||||
|
public class MagicBeautyFilter extends GPUImageFilter { |
||||||
|
private int mSingleStepOffsetLocation; |
||||||
|
|
||||||
|
public MagicBeautyFilter(){ |
||||||
|
super(MagicFilterType.BEAUTY, R.raw.beauty); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mSingleStepOffsetLocation = GLES20.glGetUniformLocation(getProgram(), "singleStepOffset"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
setFloatVec2(mSingleStepOffsetLocation, new float[] {2.0f / width, 2.0f / height}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,89 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicBlackCatFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicBlackCatFilter(){ |
||||||
|
super(MagicFilterType.BLACKCAT, R.raw.blackcat); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 7, 8, 10, 11, 13, 15, 16, 18, 20, 21, 23, 24, 26, 28, 29, 31, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 50, 52, 53, 55, 57, 58, 60, 61, 63, 65, 66, 68, 69, 71, 72, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 97, 99, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 129, 131, 132, 134, 135, 136, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, 158, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, 172, 173, 174, 175, 176, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 248, 249, 250, 250, 251, 251, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 7, 8, 10, 11, 13, 15, 16, 16, 18, 20, 21, 23, 24, 26, 28, 29, 31, 33, 34, 36, 37, 39, 41, 41, 42, 44, 45, 47, 49, 50, 52, 53, 55, 57, 58, 60, 61, 63, 65, 66, 68, 69, 71, 72, 74, 76, 77, 79, 80, 82, 83, 85, 86, 86, 88, 90, 91, 93, 94, 96, 97, 99, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 129, 131, 134, 135, 136, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, 158, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, 172, 173, 174, 175, 176, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 199, 200, 201, 203, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 215, 216, 217, 219, 220, 220, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 229, 230, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 242, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 5, 7, 8, 10, 10, 11, 13, 15, 16, 18, 20, 20, 21, 23, 24, 26, 28, 29, 29, 31, 33, 34, 36, 37, 39, 39, 41, 42, 44, 45, 47, 49, 50, 50, 52, 53, 55, 57, 58, 60, 61, 63, 63, 65, 66, 68, 69, 71, 72, 74, 76, 77, 79, 79, 80, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 97, 99, 100, 100, 102, 103, 105, 106, 108, 109, 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 129, 131, 132, 134, 135, 136, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, 158, 159, 160, 162, 164, 165, 167, 168, 169, 170, 172, 173, 174, 175, 176, 178, 179, 180, 181, 182, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 215, 216, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 229, 230, 232, 232, 233, 234, 234, 235, 236, 236, 238, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 249, 250, 250, 251, 251, 252, 253, 254, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt4 = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 19, 20, 21, 21, 23, 24, 25, 26, 26, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 38, 39, 40, 41, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 70, 71, 72, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 82, 83, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 107, 107, 108, 109, 111, 112, 113, 114, 114, 115, 116, 117, 119, 120, 120, 121, 122, 123, 124, 125, 126, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 139, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 151, 151, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 189, 189, 190, 191, 192, 193, 194, 195, 195, 196, 198, 199, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 213, 214, 214, 215, 216, 218, 219, 220, 221, 221, 222, 223, 225, 227, 227, 228, 229, 230, 230, 230, 230, 230, 230, 230, 230, 230 }; |
||||||
|
int[] arrayOfInt5 = { 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 89, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 126, 128, 129, 131, 132, 134, 135, 137, 138, 140, 141, 142, 144, 145, 147, 148, 149, 151, 152, 154, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 170, 171, 172, 173, 175, 176, 177, 178, 180, 181, 182, 183, 184, 186, 187, 188, 189, 190, 191, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 225, 226, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 241, 241, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 254, 255, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt4[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicBrannanFilter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicBrannanFilter(){ |
||||||
|
super(MagicFilterType.BRANNAN, R.raw.brannan); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for (int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_process.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_blowout.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_contrast.png"); |
||||||
|
inputTextureHandles[3] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_luma.png"); |
||||||
|
inputTextureHandles[4] = OpenGLUtils.loadTexture(getContext(), "filter/brannan_screen.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicBrooklynFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicBrooklynFilter(){ |
||||||
|
super(MagicFilterType.BROOKLYN, R.raw.brooklyn); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for (int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for (int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/brooklynCurves1.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/filter_map_first.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/brooklynCurves2.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,125 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicCalmFilter extends GPUImageFilter{ |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mMaskGrey2TextureId = -1; |
||||||
|
private int mMaskGrey2UniformLocation; |
||||||
|
|
||||||
|
public MagicCalmFilter(){ |
||||||
|
super(MagicFilterType.CALM, R.raw.calm); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(3, new int[]{mToneCurveTexture[0], mMaskGrey1TextureId, mMaskGrey2TextureId}, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
mMaskGrey2TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey2TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey2UniformLocation, 5); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey1Frame"); |
||||||
|
mMaskGrey2UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey2Frame"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[3072]; |
||||||
|
int[] arrayOfInt1 = { 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 229, 230, 231, 232, 233, 234, 235, 235, 236, 237, 238, 239, 240, 241, 241, 242, 243, 244, 245, 246, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt2 = { 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 232, 233, 234, 235, 237, 238, 239, 240, 241, 243, 244, 245, 246, 248, 249, 250, 251, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 42, 43, 44, 46, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 64, 65, 67, 69, 70, 72, 74, 75, 77, 79, 80, 82, 84, 85, 87, 89, 91, 92, 94, 96, 97, 99, 101, 102, 104, 106, 107, 109, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 152, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 200, 201, 202, 203, 203, 204, 205, 206, 206, 207, 208, 209, 209, 210, 211, 211, 212, 213, 214, 214, 215, 216, 216, 217, 218, 218, 219, 220, 220, 221, 222, 222, 223, 224, 224, 225, 226, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 243, 244, 245, 245, 246, 246, 247, 247, 248, 249, 249, 250, 250, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt3[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt3[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt2[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt4 = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 33, 34, 35, 37, 38, 39, 41, 42, 43, 45, 46, 47, 49, 50, 51, 53, 54, 55, 57, 58, 59, 61, 62, 63, 64, 66, 67, 68, 70, 71, 72, 74, 75, 76, 77, 79, 80, 81, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 202, 203, 204, 205, 205, 206, 207, 208, 208, 209, 210, 211, 211, 212, 213, 214, 214, 215, 216, 216, 217, 218, 218, 219, 220, 221, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235, 235, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 246, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt5 = { 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 105, 106, 107, 109, 110, 111, 113, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 137, 138, 140, 142, 143, 145, 147, 148, 150, 152, 153, 155, 157, 159, 161, 162, 164, 166, 168, 170, 172, 174, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 247, 249, 251, 253, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int k = 0; k < 256; k++){ |
||||||
|
arrayOfByte[(2048 + k * 4)] = ((byte)arrayOfInt4[k]); |
||||||
|
arrayOfByte[(1 + (2048 + k * 4))] = ((byte)arrayOfInt5[k]); |
||||||
|
arrayOfByte[(2 + (2048 + k * 4))] = ((byte)arrayOfInt6[k]); |
||||||
|
arrayOfByte[(3 + (2048 + k * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 3, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
mMaskGrey1TextureId = OpenGLUtils.loadTexture(getContext(), "filter/calm_mask1.jpg"); |
||||||
|
mMaskGrey2TextureId = OpenGLUtils.loadTexture(getContext(), "filter/calm_mask2.jpg"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,87 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicCoolFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicCoolFilter(){ |
||||||
|
super(MagicFilterType.COOL, R.raw.cool); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
this.mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (this.mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (this.mToneCurveTexture[0] != -1) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(this.mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 102, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 119, 120, 121, 123, 124, 126, 127, 128, 130, 131, 133, 134, 136, 137, 139, 140, 142, 143, 145, 146, 148, 149, 151, 152, 154, 155, 157, 158, 160, 161, 163, 165, 166, 168, 169, 171, 173, 174, 176, 177, 179, 181, 182, 184, 185, 187, 189, 190, 192, 194, 195, 197, 199, 200, 202, 204, 205, 207, 209, 210, 212, 214, 216, 217, 219, 221, 222, 224, 226, 228, 229, 231, 233, 234, 236, 238, 240, 241, 243, 245, 246, 248, 250, 252, 253, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 3, 6, 9, 11, 14, 17, 20, 23, 26, 28, 31, 34, 37, 40, 43, 45, 48, 51, 54, 57, 59, 62, 65, 68, 70, 73, 76, 79, 81, 84, 87, 89, 92, 95, 97, 100, 102, 105, 108, 110, 113, 115, 118, 120, 123, 125, 128, 130, 133, 135, 137, 140, 142, 144, 147, 149, 151, 153, 156, 158, 160, 162, 164, 166, 168, 171, 173, 175, 177, 179, 180, 182, 184, 186, 188, 190, 191, 193, 195, 197, 198, 200, 201, 203, 205, 206, 207, 209, 210, 212, 213, 214, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 13, 17, 21, 24, 32, 36, 39, 46, 50, 53, 56, 62, 65, 68, 73, 75, 78, 80, 85, 87, 88, 92, 94, 95, 96, 99, 100, 102, 104, 106, 107, 109, 110, 112, 113, 115, 116, 117, 120, 121, 122, 123, 125, 126, 127, 129, 130, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 149, 150, 151, 152, 154, 154, 155, 156, 158, 159, 159, 161, 162, 163, 163, 165, 166, 166, 168, 169, 169, 170, 172, 172, 173, 175, 175, 176, 177, 178, 179, 180, 181, 182, 182, 184, 184, 185, 186, 187, 188, 188, 190, 190, 191, 192, 193, 194, 194, 196, 196, 197, 197, 199, 199, 200, 201, 202, 202, 203, 204, 205, 205, 207, 207, 208, 208, 210, 210, 211, 212, 213, 213, 214, 215, 215, 216, 217, 218, 218, 219, 220, 221, 221, 222, 223, 223, 224, 225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 246, 246, 247, 248, 248, 249, 249, 250, 251, 251, 252, 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
public class MagicCrayonFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mSingleStepOffsetLocation; |
||||||
|
//1.0 - 5.0
|
||||||
|
private int mStrengthLocation; |
||||||
|
|
||||||
|
public MagicCrayonFilter(){ |
||||||
|
super(MagicFilterType.CRAYON, R.raw.crayon); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mSingleStepOffsetLocation = GLES20.glGetUniformLocation(getProgram(), "singleStepOffset"); |
||||||
|
mStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
setFloat(mStrengthLocation, 2.0f); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mStrengthLocation, 0.5f); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
setFloatVec2(mSingleStepOffsetLocation, new float[] {1.0f / width, 1.0f / height}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,69 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicEarlyBirdFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1,-1,-1}; |
||||||
|
protected int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicEarlyBirdFilter(){ |
||||||
|
super(MagicFilterType.EARLYBIRD, R.raw.earlybird); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture"+(2+i)); |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/earlybirdcurves.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/earlybirdoverlaymap_new.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/vignettemap_new.png"); |
||||||
|
inputTextureHandles[3] = OpenGLUtils.loadTexture(getContext(), "filter/earlybirdblowout.png"); |
||||||
|
inputTextureHandles[4] = OpenGLUtils.loadTexture(getContext(), "filter/earlybirdmap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,88 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicEmeraldFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicEmeraldFilter(){ |
||||||
|
super(MagicFilterType.EMERALD, R.raw.emerald); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 21, 22, 23, 25, 26, 29, 30, 31, 32, 34, 35, 36, 39, 40, 41, 43, 44, 45, 46, 48, 50, 51, 53, 54, 55, 56, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 72, 73, 75, 76, 77, 78, 79, 81, 82, 84, 85, 87, 88, 89, 90, 91, 92, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 210, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 226, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 241, 242, 242, 243, 244, 244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 0, 0, 1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 16, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 41, 43, 44, 45, 46, 48, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 94, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 109, 111, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 131, 132, 133, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 206, 207, 209, 210, 210, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 226, 226, 227, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 239, 240, 241, 242, 242, 243, 244, 244, 245, 247, 247, 248, 249, 249, 250, 251, 251, 252, 253, 254, 254, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 41, 43, 44, 45, 46, 48, 49, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 94, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 210, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 226, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 239, 240, 241, 242, 242, 243, 244, 244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 253, 254, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt4 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt5 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 126, 127, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 151, 152, 154, 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 229, 230, 231, 232, 233, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 250, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt4[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,80 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicEvergreenFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicEvergreenFilter(){ |
||||||
|
super(MagicFilterType.EVERGREEN, R.raw.evergreen); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 155, 156, 157, 158, 159, 160, 162, 163, 164, 165, 166, 167, 169, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 241, 242, 243, 244, 245, 246, 247, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 2, 4, 6, 8, 10, 11, 13, 16, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 31, 32, 33, 34, 36, 38, 39, 40, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 144, 145, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 157, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 205, 206, 207, 207, 208, 209, 210, 211, 212, 213, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 225, 226, 227, 228, 229, 230, 231, 231, 232, 234, 235, 236, 237, 237, 238, 239, 240, 241, 242, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++) |
||||||
|
{ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,75 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicFreudFilter extends GPUImageFilter { |
||||||
|
private int mTexelHeightUniformLocation; |
||||||
|
private int mTexelWidthUniformLocation; |
||||||
|
private int[] inputTextureHandles = {-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicFreudFilter(){ |
||||||
|
super(MagicFilterType.FREUD, R.raw.freud); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for (int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for (int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
inputTextureUniformLocations[0] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture2"); |
||||||
|
|
||||||
|
mTexelWidthUniformLocation = GLES20.glGetUniformLocation(getProgram(), "inputImageTextureWidth"); |
||||||
|
mTexelHeightUniformLocation = GLES20.glGetUniformLocation(getProgram(), "inputImageTextureHeight"); |
||||||
|
|
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/freud_rand.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
GLES20.glUniform1f(mTexelWidthUniformLocation, (float)width); |
||||||
|
GLES20.glUniform1f(mTexelHeightUniformLocation, (float)height); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,109 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicHealthyFilter extends GPUImageFilter{ |
||||||
|
|
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mTexelHeightUniformLocation; |
||||||
|
private int mTexelWidthUniformLocation; |
||||||
|
|
||||||
|
public MagicHealthyFilter(){ |
||||||
|
super(MagicFilterType.HEALTHY, R.raw.healthy); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
int[] texture = new int[1]; |
||||||
|
texture[0] = mMaskGrey1TextureId; |
||||||
|
GLES20.glDeleteTextures(1, texture, 0); |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "mask"); |
||||||
|
mTexelWidthUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelWidthOffset"); |
||||||
|
mTexelHeightUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelHeightOffset"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt1 = { 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 200, 200, 201, 202, 202, 203, 204, 204, 205, 206, 207, 207, 208, 209, 209, 210, 211, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 7, 8, 9, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 234, 235, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 249, 249, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++) |
||||||
|
{ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height){ |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
GLES20.glUniform1f(mTexelWidthUniformLocation, 1.0f / width); |
||||||
|
GLES20.glUniform1f(mTexelHeightUniformLocation, 1.0f / height); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicHefeFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicHefeFilter(){ |
||||||
|
super(MagicFilterType.HEFE, R.raw.hefe); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/edgeburn.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/hefemap.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/hefemetal.png"); |
||||||
|
inputTextureHandles[3] = OpenGLUtils.loadTexture(getContext(), "filter/hefesoftlight.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicHudsonFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicHudsonFilter(){ |
||||||
|
super(MagicFilterType.HUDSON, R.raw.hudson); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/ohudsonbackground.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/overlaymap.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/hudsonmap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,55 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import com.seu.magicfilter.base.MagicBaseGroupFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageBrightnessFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageContrastFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageExposureFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageHueFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageSaturationFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageSharpenFilter; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class MagicImageAdjustFilter extends MagicBaseGroupFilter { |
||||||
|
|
||||||
|
public MagicImageAdjustFilter() { |
||||||
|
super(initFilters()); |
||||||
|
} |
||||||
|
|
||||||
|
private static List<GPUImageFilter> initFilters(){ |
||||||
|
List<GPUImageFilter> filters = new ArrayList<GPUImageFilter>(); |
||||||
|
filters.add(new GPUImageContrastFilter()); |
||||||
|
filters.add(new GPUImageBrightnessFilter()); |
||||||
|
filters.add(new GPUImageExposureFilter()); |
||||||
|
filters.add(new GPUImageHueFilter()); |
||||||
|
filters.add(new GPUImageSaturationFilter()); |
||||||
|
filters.add(new GPUImageSharpenFilter()); |
||||||
|
return filters; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSharpness(final float range){ |
||||||
|
((GPUImageSharpenFilter) filters.get(5)).setSharpness(range); |
||||||
|
} |
||||||
|
|
||||||
|
public void setHue(final float range){ |
||||||
|
((GPUImageHueFilter) filters.get(3)).setHue(range); |
||||||
|
} |
||||||
|
|
||||||
|
public void setBrightness(final float range){ |
||||||
|
((GPUImageBrightnessFilter) filters.get(1)).setBrightness(range); |
||||||
|
} |
||||||
|
|
||||||
|
public void setContrast(final float range){ |
||||||
|
((GPUImageContrastFilter) filters.get(0)).setContrast(range); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSaturation(final float range){ |
||||||
|
((GPUImageSaturationFilter) filters.get(4)).setSaturation(range); |
||||||
|
} |
||||||
|
|
||||||
|
public void setExposure(final float range){ |
||||||
|
((GPUImageExposureFilter) filters.get(2)).setExposure(range); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicInkwellFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicInkwellFilter(){ |
||||||
|
super(MagicFilterType.INKWELL, R.raw.inkwell); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/inkwellmap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicKevinFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicKevinFilter(){ |
||||||
|
super(MagicFilterType.KEVIN, R.raw.kevin_new); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, inputTextureHandles, 0); |
||||||
|
for (int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/kelvinmap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,88 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicLatteFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicLatteFilter(){ |
||||||
|
super(MagicFilterType.LATTE, R.raw.latte); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 5, 6, 8, 9, 11, 12, 14, 15, 16, 18, 19, 21, 22, 23, 25, 26, 28, 29, 30, 32, 33, 34, 36, 37, 39, 40, 41, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 5, 6, 8, 11, 12, 14, 15, 18, 19, 21, 22, 25, 26, 28, 29, 32, 33, 34, 36, 39, 40, 41, 43, 44, 46, 48, 49, 50, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 125, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 174, 175, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 183, 184, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 199, 200, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 213, 213, 214, 215, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 224, 225, 226, 226, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 237, 238, 239, 240, 240, 241, 242, 243, 244, 245, 246, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 5, 6, 8, 11, 12, 14, 15, 16, 18, 21, 22, 23, 25, 26, 28, 30, 32, 33, 34, 36, 37, 40, 41, 43, 44, 45, 46, 49, 50, 52, 53, 54, 55, 58, 59, 60, 61, 62, 64, 66, 67, 68, 69, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 120, 121, 123, 124, 125, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 166, 167, 168, 169, 170, 170, 170, 171, 172, 173, 174, 174, 175, 176, 176, 177, 178, 178, 179, 180, 180, 181, 182, 183, 183, 184, 184, 185, 186, 187, 188, 189, 189, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 197, 198, 198, 199, 199, 200, 201, 202, 202, 203, 204, 205, 206, 206, 207, 208, 209, 209, 210, 211, 212, 213, 213, 214, 215, 215, 215, 216, 217, 218, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230, 230, 231, 232, 233, 233, 234, 235, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt4 = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 61, 62, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 131, 132, 133, 134, 135, 137, 138, 139, 140, 141, 143, 144, 145, 146, 147, 149, 150, 151, 152, 153, 155, 156, 157, 158, 159, 161, 162, 163, 164, 165, 167, 168, 169, 170, 171, 173, 174, 175, 176, 177, 179, 180, 181, 182, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 208, 209, 210, 211, 212, 214, 215, 216, 217, 218, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 232, 233, 234, 235, 236, 238, 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240 }; |
||||||
|
int[] arrayOfInt5 = { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52, 53, 54, 56, 57, 58, 59, 61, 62, 63, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 90, 92, 93, 94, 96, 97, 99, 100, 101, 103, 104, 106, 107, 108, 110, 111, 113, 114, 116, 117, 119, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 140, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, 158, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 234, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt4[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicLomoFilter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicLomoFilter(){ |
||||||
|
super(MagicFilterType.LOMO, R.raw.lomo); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/vlomomap_new.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/vignette_map.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,59 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicN1977Filter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicN1977Filter(){ |
||||||
|
super(MagicFilterType.N1977, R.raw.n1977); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/n1977map.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/n1977blowout.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicNashvilleFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicNashvilleFilter(){ |
||||||
|
super(MagicFilterType.NASHVILLE, R.raw.nashville); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/nashvillemap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,140 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicNostalgiaFilter extends GPUImageFilter { |
||||||
|
private int mBlurSizeUniformLocation; |
||||||
|
private int mTexelWidthUniformLocation; |
||||||
|
private int mTexelHeightUniformLocation; |
||||||
|
private int[] mToneCurveTexture = { -1 }; |
||||||
|
private int[] mToneCurveTexture2 = { -1 }; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mToneCurveTextureUniformLocation2; |
||||||
|
|
||||||
|
public MagicNostalgiaFilter(){ |
||||||
|
super(MagicFilterType.NOSTALGIA, R.raw.nostalgia); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture2, 0); |
||||||
|
mToneCurveTexture2[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mToneCurveTexture2[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mToneCurveTexture2[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation2, 4); |
||||||
|
} |
||||||
|
GLES20.glUniform1f(mBlurSizeUniformLocation, 1.0F); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mToneCurveTextureUniformLocation2 = GLES20.glGetUniformLocation(getProgram(), "curve2"); |
||||||
|
mTexelWidthUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelWidthOffset"); |
||||||
|
mTexelHeightUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelHeightOffset"); |
||||||
|
mBlurSizeUniformLocation = GLES20.glGetUniformLocation(getProgram(), "blurSize"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte1 = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 5, 6, 8, 9, 11, 13, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 39, 41, 43, 45, 47, 49, 50, 52, 54, 56, 57, 59, 61, 62, 64, 66, 68, 69, 71, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90, 91, 93, 94, 96, 97, 98, 100, 101, 103, 104, 106, 107, 108, 110, 111, 112, 114, 115, 116, 118, 119, 120, 122, 123, 124, 125, 127, 128, 129, 130, 131, 133, 134, 135, 136, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 204, 205, 206, 207, 207, 208, 209, 210, 210, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 219, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 233, 234, 235, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 246, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 39, 40, 42, 43, 44, 46, 47, 49, 50, 52, 53, 54, 56, 57, 59, 60, 61, 63, 64, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87, 88, 89, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 119, 120, 121, 122, 124, 125, 126, 127, 129, 130, 131, 132, 134, 135, 136, 137, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235, 235, 236, 237, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 244, 245, 246, 246, 247, 248, 248, 249, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 31, 33, 35, 37, 39, 41, 43, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 82, 84, 85, 87, 89, 91, 92, 94, 96, 98, 99, 101, 102, 104, 106, 107, 109, 110, 112, 114, 115, 117, 118, 119, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 186, 187, 188, 189, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 200, 200, 201, 202, 202, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 210, 210, 211, 212, 212, 213, 214, 214, 215, 216, 216, 217, 218, 218, 219, 220, 220, 221, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte1[(0 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte1[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte1[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte1[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 32, 33, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 47, 48, 50, 51, 52, 53, 55, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 72, 74, 75, 76, 77, 79, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 204, 205, 206, 207, 209, 210, 211, 213, 214, 215, 217, 218, 220, 221, 222, 224, 225, 227, 228, 230, 231, 233, 234, 235, 237, 238, 240, 241, 243, 244, 246, 247, 249, 250, 252, 253, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 3, 6, 8, 11, 14, 16, 18, 21, 24, 26, 29, 30, 33, 35, 37, 39, 41, 43, 45, 47, 49, 50, 52, 53, 54, 56, 58, 59, 61, 62, 63, 65, 65, 66, 68, 69, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 146, 146, 147, 147, 148, 149, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 158, 159, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 170, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 182, 183, 183, 184, 185, 186, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 193, 194, 194, 194, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 205, 205, 206, 206, 207, 207, 208, 209, 209, 210, 211, 211, 212, 213, 213, 214, 215, 215, 216, 217, 217, 217, 217, 218, 219, 219, 220, 221, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 228, 229, 229, 229, 230, 231, 231, 232, 232, 233, 234, 234, 235 }; |
||||||
|
int[] arrayOfInt7 = { 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 119, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 137, 139, 140, 142, 143, 145, 147, 148, 150, 152, 153, 155, 156, 158, 160, 161, 163, 164, 166, 167, 169, 170, 172, 173, 175, 176, 178, 179, 180, 182, 183, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, 199, 200, 201, 203, 204, 205, 206, 208, 209, 210, 212, 213, 214, 216, 217, 218, 219, 221, 222, 223, 224, 226, 227, 228, 229, 231, 232, 233, 234, 236, 237, 238, 239, 240, 242, 243, 244, 245, 247, 248, 249, 250, 251, 253, 254, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte1[(0 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte1[(1 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte1[(2 + (1024 + j * 4))] = ((byte)arrayOfInt7[j]); |
||||||
|
arrayOfByte1[(3 + (1024 + j * 4))] = ((byte)arrayOfInt4[j]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte1)); |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture2, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture2[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte2 = new byte[1024]; |
||||||
|
int[] arrayOfInt8 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
int[] arrayOfInt9 = { 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 62, 63, 64, 65, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 72, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 246, 246, 247, 248, 248, 249, 250, 251, 251, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt10 = { 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 225, 225, 226, 227, 227, 228, 229, 230, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 240, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 246, 247, 248, 248, 249, 250, 250, 251, 251, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt11 = { 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 214, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 229, 230, 231, 232, 233, 234, 234, 235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 244, 244, 245, 246, 247, 248, 248, 249, 250, 251, 252, 253, 253, 254, 255 }; |
||||||
|
for (int k = 0; k < 256; k++){ |
||||||
|
arrayOfByte2[(0 + k * 4)] = ((byte)arrayOfInt9[k]); |
||||||
|
arrayOfByte2[(1 + k * 4)] = ((byte)arrayOfInt10[k]); |
||||||
|
arrayOfByte2[(2 + k * 4)] = ((byte)arrayOfInt11[k]); |
||||||
|
arrayOfByte2[(3 + k * 4)] = ((byte)arrayOfInt8[k]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte2)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
GLES20.glUniform1f(mTexelWidthUniformLocation, (1.0f / (float)width)); |
||||||
|
GLES20.glUniform1f(mTexelHeightUniformLocation, (1.0f / (float)height)); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicPixelFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicPixelFilter(){ |
||||||
|
super(MagicFilterType.PIXAR, R.raw.pixar); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, inputTextureHandles, 0); |
||||||
|
for (int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for (int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for (int i=0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
// inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/pixar_curves.png");
|
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
|
||||||
|
public class MagicRiseFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1}; |
||||||
|
|
||||||
|
public MagicRiseFilter(){ |
||||||
|
super(MagicFilterType.RISE, R.raw.rise); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i=0; i < inputTextureUniformLocations.length; i++){ |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture"+(2+i)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/blackboard1024.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/overlaymap.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/risemap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,81 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicRomanceFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicRomanceFilter(){ |
||||||
|
super(MagicFilterType.ROMANCE, R.raw.romance); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] romance_arrayOfByte = new byte[1024]; |
||||||
|
int[] romance_arrayOfInt1 = { 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 116, 117, 118, 119, 120, 122, 123, 124, 125, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 140, 141, 143, 144, 145, 146, 148, 149, 150, 151, 153, 154, 155, 156, 158, 159, 160, 161, 162, 164, 165, 166, 167, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 182, 183, 184, 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 222, 223, 224, 225, 226, 226, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 252, 253, 254, 254, 255 }; |
||||||
|
int[] romance_arrayOfInt2 = { 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 164, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 189, 190, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] romance_arrayOfInt3 = { 0, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 20, 21, 23, 25, 26, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63, 65, 66, 67, 69, 70, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 131, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 147, 148, 149, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255 }; |
||||||
|
int[] romance_arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
romance_arrayOfByte[(i * 4)] = ((byte)romance_arrayOfInt1[i]); |
||||||
|
romance_arrayOfByte[(1 + i * 4)] = ((byte)romance_arrayOfInt2[i]); |
||||||
|
romance_arrayOfByte[(2 + i * 4)] = ((byte)romance_arrayOfInt3[i]); |
||||||
|
romance_arrayOfByte[(3 + i * 4)] = ((byte)romance_arrayOfInt4[i]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(romance_arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,89 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicSakuraFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mTexelHeightUniformLocation; |
||||||
|
private int mTexelWidthUniformLocation; |
||||||
|
|
||||||
|
public MagicSakuraFilter(){ |
||||||
|
super(MagicFilterType.SAKURA, R.raw.romance); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mTexelWidthUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelWidthOffset"); |
||||||
|
mTexelHeightUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelHeightOffset"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt = { 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 200, 200, 201, 202, 202, 203, 204, 204, 205, 206, 207, 207, 208, 209, 209, 210, 211, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
for (int i = 0; i < 256; i++) |
||||||
|
{ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
GLES20.glUniform1f(mTexelWidthUniformLocation, (1.0f / (float)width)); |
||||||
|
GLES20.glUniform1f(mTexelHeightUniformLocation, (1.0f / (float)height)); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicSierraFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicSierraFilter(){ |
||||||
|
super(MagicFilterType.SIERRA, R.raw.sierra); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture"+(2+i)); |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/sierravignette.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/overlaymap.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/sierramap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
public class MagicSketchFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mSingleStepOffsetLocation; |
||||||
|
//0.0 - 1.0
|
||||||
|
private int mStrengthLocation; |
||||||
|
|
||||||
|
public MagicSketchFilter(){ |
||||||
|
super(MagicFilterType.SKETCH, R.raw.sketch); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mSingleStepOffsetLocation = GLES20.glGetUniformLocation(getProgram(), "singleStepOffset"); |
||||||
|
mStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mStrengthLocation, 0.5f); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
setFloatVec2(mSingleStepOffsetLocation, new float[] {1.0f / width, 1.0f / height}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,93 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicSkinWhitenFilter extends GPUImageFilter { |
||||||
|
private int mTexelHeightUniformLocation; |
||||||
|
private int mTexelWidthUniformLocation; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int[] mToneCurveTexture = new int[] {-1}; |
||||||
|
|
||||||
|
public MagicSkinWhitenFilter() { |
||||||
|
super(MagicFilterType.SKINWHITEN, R.raw.skinwhiten); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mTexelWidthUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelWidthOffset"); |
||||||
|
mTexelHeightUniformLocation = GLES20.glGetUniformLocation(getProgram(), "texelHeightOffset"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
public void run() { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt1 = { 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 200, 200, 201, 202, 202, 203, 204, 204, 205, 206, 207, 207, 208, 209, 209, 210, 211, 211, 212, 213, 213, 214, 215, 216, 216, 217, 218, 218, 219, 220, 220, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 239, 239, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
super.onDrawArraysPre(); |
||||||
|
if(mToneCurveTexture[0] != -1) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(this.mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
super.onDrawArraysAfter(); |
||||||
|
if (mToneCurveTexture[0] != -1) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
GLES20.glUniform1f(mTexelWidthUniformLocation, (1.0f / (float)width)); |
||||||
|
GLES20.glUniform1f(mTexelHeightUniformLocation, (1.0f / (float)height)); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,139 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicSunriseFilter extends GPUImageFilter { |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mMaskGrey2TextureId = -1; |
||||||
|
private int mMaskGrey2UniformLocation; |
||||||
|
private int mMaskGrey3TextureId = -1; |
||||||
|
private int mMaskGrey3UniformLocation; |
||||||
|
private int[] mToneCurveTexture = { -1 }; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicSunriseFilter(){ |
||||||
|
super(MagicFilterType.SUNRISE, R.raw.sunrise); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
GLES20.glDeleteTextures(1, new int[]{mMaskGrey1TextureId}, 0); |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
GLES20.glDeleteTextures(1, new int[]{mMaskGrey2TextureId}, 0); |
||||||
|
mMaskGrey2TextureId = -1; |
||||||
|
GLES20.glDeleteTextures(1, new int[]{mMaskGrey3TextureId}, 0); |
||||||
|
mMaskGrey3TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey3TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE6); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey2TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey2UniformLocation, 5); |
||||||
|
} |
||||||
|
if (mMaskGrey3TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE6); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey3TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey3UniformLocation, 6); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey1Frame"); |
||||||
|
mMaskGrey2UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey2Frame"); |
||||||
|
mMaskGrey3UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey3Frame"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 30, 31, 32, 34, 35, 36, 38, 39, 41, 42, 44, 45, 47, 49, 50, 52, 54, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 92, 94, 96, 98, 101, 103, 105, 107, 110, 111, 113, 115, 118, 120, 122, 124, 126, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 150, 152, 154, 156, 158, 159, 161, 162, 164, 166, 167, 169, 170, 172, 173, 174, 176, 177, 178, 180, 181, 182, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 203, 204, 205, 205, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 213, 214, 214, 215, 215, 215, 216, 216, 216, 216, 217, 217, 217, 218, 218, 218, 218, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 224, 224, 224, 224, 224, 225, 225, 225, 225, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 229, 230, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 238, 238, 239, 239, 241, 241, 242, 243, 243, 244, 245, 245, 246, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, 42, 44, 45, 47, 48, 50, 52, 54, 55, 57, 59, 61, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 83, 85, 87, 90, 92, 94, 96, 98, 101, 103, 105, 107, 110, 111, 113, 115, 117, 119, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 143, 145, 147, 149, 150, 152, 154, 155, 157, 158, 160, 161, 163, 164, 165, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 205, 207, 207, 208, 208, 208, 209, 209, 210, 210, 210, 211, 211, 211, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 219, 219, 219, 220, 220, 220, 221, 221, 222, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 236, 237, 237, 238, 238, 239, 239, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 1, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 28, 29, 30, 32, 33, 35, 36, 38, 39, 41, 43, 44, 46, 47, 49, 51, 53, 54, 56, 58, 60, 62, 64, 66, 68, 69, 71, 73, 76, 78, 80, 82, 83, 85, 87, 89, 91, 93, 95, 97, 100, 102, 104, 106, 108, 110, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 130, 132, 134, 136, 138, 139, 141, 143, 145, 146, 148, 150, 151, 153, 155, 156, 158, 159, 161, 162, 164, 165, 167, 168, 169, 171, 172, 173, 175, 176, 177, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 204, 205, 207, 207, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 215, 216, 216, 217, 217, 217, 218, 218, 218, 219, 219, 219, 220, 220, 220, 220, 221, 221, 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 226, 226, 226, 226, 227, 227, 227, 227, 228, 228, 228, 228, 229, 229, 229, 230, 230, 230, 231, 231, 231, 232, 232, 233, 233, 233, 234, 234, 235, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 172, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 187, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199, 201, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 223, 224, 225, 226, 227, 228, 230, 231, 232, 233, 234, 235, 236, 238, 239, 240, 241, 242, 243, 245, 246, 247, 248, 249, 250, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 53, 55, 56, 57, 58, 60, 61, 62, 63, 65, 66, 67, 68, 70, 71, 72, 73, 75, 76, 77, 78, 80, 81, 82, 83, 85, 86, 87, 88, 90, 91, 92, 93, 95, 96, 97, 98, 100, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 114, 116, 117, 118, 119, 121, 122, 123, 124, 126, 127, 128, 129, 131, 132, 133, 134, 136, 137, 138, 139, 141, 142, 143, 144, 146, 147, 148, 149, 151, 152, 153, 154, 155, 157, 158, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, 172, 173, 174, 175, 177, 178, 179, 180, 182, 183, 184, 185, 187, 188, 189, 190, 192, 193, 194, 195, 197, 198, 199, 200, 202, 203, 204, 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, 218, 219, 220, 221, 223, 224, 225, 226, 228, 229, 230, 231, 233, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 248, 249, 250, 251, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt7 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 119, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 152, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 164, 165, 167, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 237, 238, 239, 240, 241, 242, 244, 245, 246, 247, 248, 249, 250, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt8 = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 126, 127, 128, 129, 130, 131, 132, 134, 135, 136, 137, 138, 139, 140, 142, 143, 144, 145, 146, 147, 149, 150, 151, 152, 153, 155, 156, 157, 158, 159, 160, 162, 163, 164, 165, 166, 168, 169, 170, 171, 173, 174, 175, 176, 177, 179, 180, 181, 182, 184, 185, 186, 187, 189, 190, 191, 192, 194, 195, 196, 197, 199, 200, 201, 202, 204, 205, 206, 208, 209, 210, 211, 213, 214, 215, 217, 218, 219, 221, 222, 223, 224, 226, 227, 228, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt7[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = ((byte)arrayOfInt8[j]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE6); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,120 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicSunsetFilter extends GPUImageFilter { |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mMaskGrey2TextureId = -1; |
||||||
|
private int mMaskGrey2UniformLocation; |
||||||
|
private int[] mToneCurveTexture = { -1 }; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicSunsetFilter(){ |
||||||
|
super(MagicFilterType.SUNSET, R.raw.sunset); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(3, new int[]{mToneCurveTexture[0], mMaskGrey1TextureId, mMaskGrey2TextureId}, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
mMaskGrey2TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey2TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey2UniformLocation, 5); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey1Frame"); |
||||||
|
mMaskGrey2UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey2Frame"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 1, 2, 3, 5, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 16, 18, 19, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 51, 52, 54, 55, 56, 59, 60, 62, 63, 64, 66, 67, 70, 71, 72, 74, 76, 78, 79, 80, 83, 84, 85, 88, 89, 90, 93, 94, 95, 98, 99, 100, 102, 104, 106, 107, 108, 109, 112, 113, 114, 116, 117, 118, 119, 120, 122, 124, 125, 126, 128, 129, 130, 131, 132, 132, 133, 135, 136, 137, 138, 139, 140, 141, 142, 142, 143, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 167, 168, 169, 169, 170, 171, 171, 172, 173, 173, 174, 175, 175, 176, 177, 177, 178, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 188, 188, 189, 190, 190, 191, 192, 193, 193, 194, 194, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 204, 205, 206, 207, 208, 208, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 222, 223, 224, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 234, 235, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 247, 248, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 9, 10, 12, 12, 13, 14, 16, 16, 17, 19, 20, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47, 49, 50, 51, 53, 54, 56, 57, 59, 61, 62, 64, 65, 66, 69, 70, 72, 73, 76, 77, 78, 80, 82, 84, 85, 87, 89, 90, 93, 94, 95, 98, 99, 100, 103, 104, 106, 108, 109, 111, 112, 114, 116, 117, 118, 120, 122, 123, 124, 125, 126, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 172, 173, 173, 174, 175, 175, 176, 177, 177, 178, 178, 178, 179, 179, 180, 181, 181, 182, 182, 183, 184, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 202, 202, 203, 204, 204, 205, 206, 207, 208, 208, 208, 209, 210, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 220, 221, 222, 222, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 234, 235, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt3 = { 0, 1, 2, 3, 4, 5, 5, 7, 8, 9, 9, 11, 12, 12, 13, 14, 16, 16, 17, 18, 20, 20, 21, 22, 23, 25, 25, 26, 27, 29, 30, 31, 31, 32, 34, 35, 36, 37, 39, 40, 41, 41, 42, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 76, 78, 79, 80, 82, 83, 84, 85, 88, 89, 90, 92, 93, 94, 95, 98, 99, 100, 102, 103, 104, 106, 107, 108, 111, 112, 113, 114, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 166, 166, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 178, 178, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 194, 194, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224, 225, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 235, 236, 237, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 249, 250, 251, 252, 253, 254, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 14, 16, 17, 19, 20, 21, 23, 24, 26, 27, 28, 30, 31, 32, 34, 35, 36, 38, 39, 40, 42, 43, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55, 57, 58, 59, 60, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 230, 231, 232, 233, 234, 235, 235, 236, 237, 238, 239, 239, 240, 241, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++) |
||||||
|
{ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++) |
||||||
|
{ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
mMaskGrey1TextureId = OpenGLUtils.loadTexture(getContext(), "filter/rise_mask1.jpg"); |
||||||
|
mMaskGrey2TextureId = OpenGLUtils.loadTexture(getContext(), "filter/rise_mask2.jpg"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicSutroFilter extends GPUImageFilter { |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicSutroFilter(){ |
||||||
|
super(MagicFilterType.SUTRO, R.raw.sutro); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for (int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/vignette_map.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/sutrometal.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/softlight.png"); |
||||||
|
inputTextureHandles[3] = OpenGLUtils.loadTexture(getContext(), "filter/sutroedgeburn.png"); |
||||||
|
inputTextureHandles[4] = OpenGLUtils.loadTexture(getContext(), "filter/sutrocurves.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,96 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicSweetsFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mLowPerformanceUniformLocation; |
||||||
|
|
||||||
|
public MagicSweetsFilter(){ |
||||||
|
super(MagicFilterType.SWEETS, R.raw.sweets); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(2, new int[]{mToneCurveTexture[0], mMaskGrey1TextureId}, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey1Frame"); |
||||||
|
mLowPerformanceUniformLocation = GLES20.glGetUniformLocation(getProgram(), "lowPerformance"); |
||||||
|
setInteger(mLowPerformanceUniformLocation, 1); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt = { 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 108, 109, 110, 111, 113, 114, 115, 116, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 140, 142, 143, 144, 145, 147, 148, 149, 150, 152, 153, 154, 155, 157, 158, 159, 160, 161, 163, 164, 165, 166, 167, 169, 170, 171, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 230, 231, 232, 233, 234, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 246, 246, 247, 248, 248, 249, 250, 251, 251, 252, 253, 254, 254, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)i); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
mMaskGrey1TextureId = OpenGLUtils.loadTexture(getContext(), "filter/rise_mask2.jpg"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,96 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicTenderFilter extends GPUImageFilter{ |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
|
||||||
|
public MagicTenderFilter(){ |
||||||
|
super(MagicFilterType.TENDER, R.raw.tender); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(2, new int[]{mToneCurveTexture[0], mMaskGrey1TextureId}, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "grey1Frame"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[1024]; |
||||||
|
int[] arrayOfInt1 = { 10, 12, 14, 15, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 35, 38, 40, 41, 43, 45, 47, 48, 50, 52, 53, 55, 57, 58, 60, 61, 63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 79, 80, 81, 83, 84, 86, 87, 89, 92, 93, 94, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 110, 112, 113, 114, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 184, 185, 186, 187, 187, 188, 189, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 196, 197, 198, 198, 199, 200, 200, 201, 201, 202, 202, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 216, 217, 217, 218, 218, 219, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 224, 225, 225, 226, 226, 227, 227, 227, 228, 228, 229, 229, 230, 230, 230, 231, 231, 232, 232, 232, 233, 233, 234, 234, 234, 234, 235, 235, 236, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 240, 241, 241, 242, 242 }; |
||||||
|
int[] arrayOfInt2 = { 10, 12, 14, 15, 17, 19, 19, 21, 22, 24, 26, 28, 29, 31, 33, 35, 36, 36, 38, 40, 41, 43, 45, 47, 48, 50, 52, 52, 53, 55, 57, 58, 60, 61, 63, 65, 66, 68, 69, 69, 71, 72, 74, 75, 77, 79, 80, 81, 83, 84, 86, 86, 87, 89, 90, 92, 93, 94, 96, 97, 99, 100, 101, 103, 103, 104, 105, 107, 108, 109, 110, 112, 113, 114, 116, 117, 118, 119, 120, 122, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 193, 194, 195, 195, 196, 196, 197, 198, 198, 199, 200, 200, 201, 201, 202, 202, 204, 204, 205, 205, 206, 206, 207, 207, 208, 209, 209, 210, 210, 211, 211, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 224, 225, 226, 226, 227, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 232, 233, 233, 234, 234, 234, 235, 236, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242 }; |
||||||
|
int[] arrayOfInt3 = { 10, 12, 12, 14, 15, 15, 17, 17, 19, 21, 21, 22, 24, 24, 26, 28, 28, 29, 31, 31, 33, 33, 35, 36, 36, 38, 40, 40, 41, 43, 43, 45, 47, 47, 48, 50, 52, 52, 53, 55, 55, 57, 58, 58, 60, 61, 63, 63, 65, 66, 68, 68, 69, 71, 71, 72, 74, 75, 77, 77, 79, 80, 81, 81, 83, 84, 86, 87, 87, 89, 90, 92, 93, 94, 94, 96, 97, 99, 100, 101, 103, 103, 104, 105, 107, 108, 109, 110, 112, 113, 113, 114, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 129, 130, 130, 131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 193, 195, 195, 196, 196, 197, 198, 199, 200, 200, 201, 201, 202, 203, 204, 204, 205, 206, 206, 207, 207, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 227, 227, 227, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 238, 238, 238, 239, 240, 240, 240, 241, 242, 242 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 1, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
mMaskGrey1TextureId = OpenGLUtils.loadTexture(getContext(), "filter/bluevintage_mask1.jpg"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,70 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicToasterFilter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1,-1,-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1,-1,-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicToasterFilter(){ |
||||||
|
super(MagicFilterType.TOASTER2, R.raw.toaster2_filter_shader); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/toastermetal.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/toastersoftlight.png"); |
||||||
|
inputTextureHandles[2] = OpenGLUtils.loadTexture(getContext(), "filter/toastercurves.png"); |
||||||
|
inputTextureHandles[3] = OpenGLUtils.loadTexture(getContext(), "filter/toasteroverlaymapwarm.png"); |
||||||
|
inputTextureHandles[4] = OpenGLUtils.loadTexture(getContext(), "filter/toastercolorshift.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicValenciaFilter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicValenciaFilter(){ |
||||||
|
super(MagicFilterType.VALENCIA, R.raw.valencia); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) { |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture" + (2 + i)); |
||||||
|
} |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) { |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/valenciamap.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/valenciagradientmap.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicWaldenFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int[] inputTextureHandles = {-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicWaldenFilter(){ |
||||||
|
super(MagicFilterType.WALDEN, R.raw.walden); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length && inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i+3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture"+(2+i)); |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/walden_map.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/vignette_map.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,118 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicWarmFilter extends GPUImageFilter { |
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
private int mMaskGrey1TextureId = -1; |
||||||
|
private int mMaskGrey1UniformLocation; |
||||||
|
private int mMaskGrey2TextureId = -1; |
||||||
|
private int mMaskGrey2UniformLocation; |
||||||
|
|
||||||
|
public MagicWarmFilter(){ |
||||||
|
super(MagicFilterType.WARM, R.raw.warm); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDestroy(){ |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(3, new int[]{mToneCurveTexture[0], mMaskGrey1TextureId, mMaskGrey2TextureId}, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
mMaskGrey1TextureId = -1; |
||||||
|
mMaskGrey2TextureId = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
if (mMaskGrey1TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE4); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey1TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey1UniformLocation, 4); |
||||||
|
} |
||||||
|
if (mMaskGrey2TextureId != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE5); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mMaskGrey2TextureId); |
||||||
|
GLES20.glUniform1i(mMaskGrey2UniformLocation, 5); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
mMaskGrey1UniformLocation = GLES20.glGetUniformLocation(getProgram(), "layerImage"); |
||||||
|
mMaskGrey2UniformLocation = GLES20.glGetUniformLocation(getProgram(), "greyFrame"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 12, 14, 17, 20, 23, 25, 28, 31, 33, 35, 38, 40, 42, 44, 46, 48, 50, 52, 53, 55, 57, 58, 60, 61, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 117, 119, 120, 121, 123, 124, 126, 127, 128, 130, 131, 133, 135, 136, 138, 139, 141, 143, 144, 146, 148, 149, 151, 153, 154, 156, 158, 159, 161, 163, 165, 166, 168, 170, 172, 173, 175, 177, 179, 180, 182, 184, 185, 187, 189, 190, 192, 194, 195, 197, 199, 200, 202, 203, 205, 207, 208, 210, 211, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242 }; |
||||||
|
int[] arrayOfInt3 = { 9, 10, 11, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 225, 226, 227, 228, 229, 230 }; |
||||||
|
int[] arrayOfInt4 = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 37, 38, 40, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 58, 59, 61, 62, 64, 65, 67, 69, 70, 72, 73, 75, 77, 78, 80, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110, 111, 113, 114, 116, 117, 119, 120, 122, 123, 124, 126, 127, 129, 130, 131, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 165, 166, 167, 168, 169, 170, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 218, 219, 220, 221, 221, 222, 223, 223, 224, 225, 225, 226, 227, 227, 228, 228, 229, 230, 230, 231, 231, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt3[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = ((byte)arrayOfInt4[i]); |
||||||
|
} |
||||||
|
int[] arrayOfInt5 = { 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, 63, 64, 65, 66, 68, 69, 70, 71, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 92, 93, 94, 95, 95, 97, 98, 99, 100, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 173, 174, 175, 176, 177, 178, 179, 180, 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 231, 233, 234, 235, 236, 237, 239, 240, 241, 242, 243, 243, 244, 246, 247, 248, 249, 250, 251, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt6 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 137, 138, 139, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 173, 174, 175, 176, 177, 178, 179, 180, 182, 183, 184, 185, 186, 187, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 231, 233, 234, 235, 236, 237, 239, 240, 241, 242, 243, 244, 246, 247, 249, 250, 251, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt7 = { 45, 45, 46, 46, 47, 47, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 78, 78, 79, 79, 80, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 141, 142, 143, 144, 146, 147, 148, 149, 150, 151, 152, 154, 156, 157, 158, 159, 160, 161, 162, 165, 166, 167, 168, 169, 170, 171, 173, 175, 176, 177, 178, 179, 180, 182, 183, 184, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 217, 219, 220, 221, 222, 223, 224, 226, 227, 227, 228, 229, 230, 231, 233, 234, 235, 235, 236, 237, 239, 240, 241, 241, 242, 243, 244, 246, 246, 247, 248, 249, 250, 251, 251, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt8 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt6[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt7[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = ((byte)arrayOfInt8[j]); |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,88 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
|
||||||
|
public class MagicWhiteCatFilter extends GPUImageFilter{ |
||||||
|
|
||||||
|
private int[] mToneCurveTexture = {-1}; |
||||||
|
private int mToneCurveTextureUniformLocation; |
||||||
|
|
||||||
|
public MagicWhiteCatFilter() { |
||||||
|
super(MagicFilterType.WHITECAT, R.raw.whitecat); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(1, mToneCurveTexture, 0); |
||||||
|
mToneCurveTexture[0] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (mToneCurveTexture[0] != -1){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glUniform1i(mToneCurveTextureUniformLocation, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mToneCurveTextureUniformLocation = GLES20.glGetUniformLocation(getProgram(), "curve"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
GLES20.glGenTextures(1, mToneCurveTexture, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mToneCurveTexture[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
byte[] arrayOfByte = new byte[2048]; |
||||||
|
int[] arrayOfInt1 = { 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 249, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt2 = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 4, 5, 6, 7, 8, 10, 11, 12, 12, 13, 14, 16, 17, 18, 19, 19, 20, 22, 23, 24, 25, 26, 26, 28, 29, 30, 31, 32, 33, 35, 35, 36, 37, 38, 39, 41, 42, 42, 43, 44, 45, 46, 48, 49, 50, 50, 51, 52, 54, 55, 56, 57, 58, 58, 59, 61, 62, 63, 64, 65, 66, 66, 67, 69, 70, 71, 72, 73, 74, 75, 75, 77, 78, 79, 80, 81, 82, 83, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 236, 237, 238, 239, 240, 240 }; |
||||||
|
for (int i = 0; i < 256; i++){ |
||||||
|
arrayOfByte[(i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(1 + i * 4)] = ((byte)arrayOfInt1[i]); |
||||||
|
arrayOfByte[(2 + i * 4)] = ((byte)arrayOfInt2[i]); |
||||||
|
arrayOfByte[(3 + i * 4)] = -1; |
||||||
|
} |
||||||
|
int[] arrayOfInt3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 14, 17, 19, 22, 25, 27, 30, 34, 36, 39, 41, 43, 45, 49, 51, 52, 54, 55, 57, 58, 61, 63, 64, 65, 67, 68, 69, 72, 73, 75, 76, 77, 78, 81, 82, 83, 84, 86, 87, 88, 90, 91, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 105, 106, 108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 138, 138, 139, 140, 141, 142, 144, 145, 146, 146, 147, 148, 149, 151, 152, 153, 153, 154, 155, 156, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 170, 171, 172, 172, 173, 174, 175, 176, 177, 178, 179, 180, 180, 181, 183, 183, 184, 185, 186, 186, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 204, 206, 207, 207, 208, 209, 209, 211, 212, 212, 213, 214, 214, 215, 217, 217, 218, 219, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 230, 231, 233, 233, 234, 235, 235, 236, 237, 238, 239, 239, 240, 241, 241, 242, 243, 244, 245, 245, 246, 247, 248, 249, 249, 250, 250, 251, 252, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt4 = { 0, 2, 4, 6, 8, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 32, 34, 36, 38, 40, 42, 44, 46, 47, 49, 51, 53, 54, 56, 58, 60, 61, 63, 65, 66, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 93, 95, 96, 98, 99, 100, 101, 103, 104, 105, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 224, 225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 233, 233, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 254, 255, 255, 255 }; |
||||||
|
int[] arrayOfInt5 = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 28, 29, 29, 30, 29, 31, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 47, 47, 48, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101, 103, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 185, 187, 189, 192, 194, 197, 199, 201, 204, 206, 209, 211, 214, 216, 219, 221, 224, 226, 229, 232, 234, 236, 239, 241, 245, 247, 250, 252, 255 }; |
||||||
|
for (int j = 0; j < 256; j++){ |
||||||
|
arrayOfByte[(1024 + j * 4)] = ((byte)arrayOfInt4[j]); |
||||||
|
arrayOfByte[(1 + (1024 + j * 4))] = ((byte)arrayOfInt3[j]); |
||||||
|
arrayOfByte[(2 + (1024 + j * 4))] = ((byte)arrayOfInt5[j]); |
||||||
|
arrayOfByte[(3 + (1024 + j * 4))] = -1; |
||||||
|
} |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(arrayOfByte)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.seu.magicfilter.advanced; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicXproIIFilter extends GPUImageFilter{ |
||||||
|
private int[] inputTextureHandles = {-1,-1}; |
||||||
|
private int[] inputTextureUniformLocations = {-1,-1}; |
||||||
|
private int mGLStrengthLocation; |
||||||
|
|
||||||
|
public MagicXproIIFilter(){ |
||||||
|
super(MagicFilterType.XPROII, R.raw.xproii_filter_shader); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
GLES20.glDeleteTextures(inputTextureHandles.length, inputTextureHandles, 0); |
||||||
|
for(int i = 0; i < inputTextureHandles.length; i++) |
||||||
|
inputTextureHandles[i] = -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysAfter(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3)); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onDrawArraysPre(){ |
||||||
|
for(int i = 0; i < inputTextureHandles.length |
||||||
|
&& inputTextureHandles[i] != OpenGLUtils.NO_TEXTURE; i++){ |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + (i+3) ); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, inputTextureHandles[i]); |
||||||
|
GLES20.glUniform1i(inputTextureUniformLocations[i], (i + 3)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit(){ |
||||||
|
super.onInit(); |
||||||
|
for(int i = 0; i < inputTextureUniformLocations.length; i++) |
||||||
|
inputTextureUniformLocations[i] = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture"+(2+i)); |
||||||
|
mGLStrengthLocation = GLES20.glGetUniformLocation(getProgram(), "strength"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized(){ |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(mGLStrengthLocation, 1.0f); |
||||||
|
runOnDraw(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
inputTextureHandles[0] = OpenGLUtils.loadTexture(getContext(), "filter/xpromap.png"); |
||||||
|
inputTextureHandles[1] = OpenGLUtils.loadTexture(getContext(), "filter/vignettemap_new.png"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,144 @@ |
|||||||
|
package com.seu.magicfilter.base; |
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context; |
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
import java.nio.FloatBuffer; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
public class MagicBaseGroupFilter extends GPUImageFilter { |
||||||
|
private static int[] frameBuffers = null; |
||||||
|
private static int[] frameBufferTextures = null; |
||||||
|
private int frameWidth = -1; |
||||||
|
private int frameHeight = -1; |
||||||
|
protected List<GPUImageFilter> filters; |
||||||
|
|
||||||
|
public MagicBaseGroupFilter(List<GPUImageFilter> filters) { |
||||||
|
this.filters = filters; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDestroy() { |
||||||
|
for (GPUImageFilter filter : filters) { |
||||||
|
filter.destroy(); |
||||||
|
} |
||||||
|
destroyFramebuffers(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init(Context context) { |
||||||
|
for (GPUImageFilter filter : filters) { |
||||||
|
filter.init(context); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
int size = filters.size(); |
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
filters.get(i).onInputSizeChanged(width, height); |
||||||
|
} |
||||||
|
if (frameBuffers != null && (frameWidth != width || frameHeight != height || frameBuffers.length != size - 1)) { |
||||||
|
destroyFramebuffers(); |
||||||
|
frameWidth = width; |
||||||
|
frameHeight = height; |
||||||
|
} |
||||||
|
if (frameBuffers == null) { |
||||||
|
frameBuffers = new int[size - 1]; |
||||||
|
frameBufferTextures = new int[size - 1]; |
||||||
|
|
||||||
|
for (int i = 0; i < size - 1; i++) { |
||||||
|
GLES20.glGenFramebuffers(1, frameBuffers, i); |
||||||
|
|
||||||
|
GLES20.glGenTextures(1, frameBufferTextures, i); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameBufferTextures[i]); |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, |
||||||
|
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
|
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffers[i]); |
||||||
|
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, |
||||||
|
GLES20.GL_TEXTURE_2D, frameBufferTextures[i], 0); |
||||||
|
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int onDrawFrame(final int textureId, final FloatBuffer cubeBuffer, |
||||||
|
final FloatBuffer textureBuffer) { |
||||||
|
if (frameBuffers == null || frameBufferTextures == null) { |
||||||
|
return OpenGLUtils.NOT_INIT; |
||||||
|
} |
||||||
|
int size = filters.size(); |
||||||
|
int previousTexture = textureId; |
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
GPUImageFilter filter = filters.get(i); |
||||||
|
boolean isNotLast = i < size - 1; |
||||||
|
if (isNotLast) { |
||||||
|
GLES20.glViewport(0, 0, mInputWidth, mInputHeight); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffers[i]); |
||||||
|
GLES20.glClearColor(0, 0, 0, 0); |
||||||
|
filter.onDrawFrame(previousTexture, mGLCubeBuffer, mGLTextureBuffer); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); |
||||||
|
previousTexture = frameBufferTextures[i]; |
||||||
|
} else { |
||||||
|
GLES20.glViewport(0, 0, mOutputWidth, mOutputHeight); |
||||||
|
filter.onDrawFrame(previousTexture, cubeBuffer, textureBuffer); |
||||||
|
} |
||||||
|
} |
||||||
|
return OpenGLUtils.ON_DRAWN; |
||||||
|
} |
||||||
|
|
||||||
|
public int onDrawFrame(int textureId) { |
||||||
|
if (frameBuffers == null || frameBufferTextures == null) { |
||||||
|
return OpenGLUtils.NOT_INIT; |
||||||
|
} |
||||||
|
int size = filters.size(); |
||||||
|
int previousTexture = textureId; |
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
GPUImageFilter filter = filters.get(i); |
||||||
|
boolean isNotLast = i < size - 1; |
||||||
|
if (isNotLast) { |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffers[i]); |
||||||
|
GLES20.glClearColor(0, 0, 0, 0); |
||||||
|
filter.onDrawFrame(previousTexture, mGLCubeBuffer, mGLTextureBuffer); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); |
||||||
|
previousTexture = frameBufferTextures[i]; |
||||||
|
} else { |
||||||
|
filter.onDrawFrame(previousTexture, mGLCubeBuffer, mGLTextureBuffer); |
||||||
|
} |
||||||
|
} |
||||||
|
return OpenGLUtils.ON_DRAWN; |
||||||
|
} |
||||||
|
|
||||||
|
private void destroyFramebuffers() { |
||||||
|
if (frameBufferTextures != null) { |
||||||
|
GLES20.glDeleteTextures(frameBufferTextures.length, frameBufferTextures, 0); |
||||||
|
frameBufferTextures = null; |
||||||
|
} |
||||||
|
if (frameBuffers != null) { |
||||||
|
GLES20.glDeleteFramebuffers(frameBuffers.length, frameBuffers, 0); |
||||||
|
frameBuffers = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int getSize() { |
||||||
|
return filters.size(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,58 @@ |
|||||||
|
package com.seu.magicfilter.base; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
|
||||||
|
public class MagicLookupFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
protected String table; |
||||||
|
|
||||||
|
public MagicLookupFilter(String table) { |
||||||
|
super(MagicFilterType.LOCKUP, R.raw.lookup); |
||||||
|
this.table = table; |
||||||
|
} |
||||||
|
|
||||||
|
private int mLookupTextureUniform; |
||||||
|
private int mLookupSourceTexture = OpenGLUtils.NO_TEXTURE; |
||||||
|
|
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mLookupTextureUniform = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture2"); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
public void run() { |
||||||
|
mLookupSourceTexture = OpenGLUtils.loadTexture(getContext(), table); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDestroy() { |
||||||
|
super.onDestroy(); |
||||||
|
int[] texture = new int[]{mLookupSourceTexture}; |
||||||
|
GLES20.glDeleteTextures(1, texture, 0); |
||||||
|
mLookupSourceTexture = -1; |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDrawArraysAfter() { |
||||||
|
if (mLookupSourceTexture != -1) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDrawArraysPre() { |
||||||
|
if (mLookupSourceTexture != -1) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE3); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mLookupSourceTexture); |
||||||
|
GLES20.glUniform1i(mLookupTextureUniform, 3); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
/** |
||||||
|
* brightness value ranges from -1.0 to 1.0, with 0.0 as the normal level |
||||||
|
*/ |
||||||
|
public class GPUImageBrightnessFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mBrightnessLocation; |
||||||
|
private float mBrightness; |
||||||
|
|
||||||
|
public GPUImageBrightnessFilter() { |
||||||
|
this(0.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageBrightnessFilter(final float brightness) { |
||||||
|
super(MagicFilterType.BRIGHTNESS, R.raw.brightness); |
||||||
|
mBrightness = brightness; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mBrightnessLocation = GLES20.glGetUniformLocation(getProgram(), "brightness"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setBrightness(mBrightness); |
||||||
|
} |
||||||
|
|
||||||
|
public void setBrightness(final float brightness) { |
||||||
|
mBrightness = brightness; |
||||||
|
setFloat(mBrightnessLocation, mBrightness); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,60 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Changes the contrast of the image.<br> |
||||||
|
* <br> |
||||||
|
* contrast value ranges from 0.0 to 4.0, with 1.0 as the normal level |
||||||
|
*/ |
||||||
|
public class GPUImageContrastFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mContrastLocation; |
||||||
|
private float mContrast; |
||||||
|
|
||||||
|
public GPUImageContrastFilter() { |
||||||
|
this(1.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageContrastFilter(float contrast) { |
||||||
|
super(MagicFilterType.CONTRAST, R.raw.constrast); |
||||||
|
mContrast = contrast; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mContrastLocation = GLES20.glGetUniformLocation(getProgram(), "contrast"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setContrast(mContrast); |
||||||
|
} |
||||||
|
|
||||||
|
public void setContrast(final float contrast) { |
||||||
|
mContrast = contrast; |
||||||
|
setFloat(mContrastLocation, mContrast); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,69 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
/** |
||||||
|
* exposure: The adjusted exposure (-10.0 - 10.0, with 0.0 as the default) |
||||||
|
*/ |
||||||
|
public class GPUImageExposureFilter extends GPUImageFilter { |
||||||
|
public static final String EXPOSURE_FRAGMENT_SHADER = "" + |
||||||
|
" varying highp vec2 textureCoordinate;\n" + |
||||||
|
" \n" + |
||||||
|
" uniform sampler2D inputImageTexture;\n" + |
||||||
|
" uniform highp float exposure;\n" + |
||||||
|
" \n" + |
||||||
|
" void main()\n" + |
||||||
|
" {\n" + |
||||||
|
" highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + |
||||||
|
" \n" + |
||||||
|
" gl_FragColor = vec4(textureColor.rgb * pow(2.0, exposure), textureColor.w);\n" + |
||||||
|
" } "; |
||||||
|
|
||||||
|
private int mExposureLocation; |
||||||
|
private float mExposure; |
||||||
|
|
||||||
|
public GPUImageExposureFilter() { |
||||||
|
this(0.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageExposureFilter(final float exposure) { |
||||||
|
super(MagicFilterType.EXPOSURE, R.raw.exposure); |
||||||
|
mExposure = exposure; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mExposureLocation = GLES20.glGetUniformLocation(getProgram(), "exposure"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setExposure(mExposure); |
||||||
|
} |
||||||
|
|
||||||
|
public void setExposure(final float exposure) { |
||||||
|
mExposure = exposure; |
||||||
|
setFloat(mExposureLocation, mExposure); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,404 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.content.Context; |
||||||
|
import android.graphics.PointF; |
||||||
|
import android.opengl.GLES11Ext; |
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
import com.seu.magicfilter.utils.OpenGLUtils; |
||||||
|
import com.seu.magicfilter.utils.Rotation; |
||||||
|
import com.seu.magicfilter.utils.TextureRotationUtil; |
||||||
|
|
||||||
|
import java.nio.ByteBuffer; |
||||||
|
import java.nio.ByteOrder; |
||||||
|
import java.nio.FloatBuffer; |
||||||
|
import java.nio.IntBuffer; |
||||||
|
import java.util.LinkedList; |
||||||
|
|
||||||
|
public class GPUImageFilter { |
||||||
|
|
||||||
|
private boolean mIsInitialized; |
||||||
|
private Context mContext; |
||||||
|
private MagicFilterType mType = MagicFilterType.NONE; |
||||||
|
private final LinkedList<Runnable> mRunOnDraw; |
||||||
|
private final int mVertexShaderId; |
||||||
|
private final int mFragmentShaderId; |
||||||
|
|
||||||
|
private int mGLProgId; |
||||||
|
private int mGLPositionIndex; |
||||||
|
private int mGLInputImageTextureIndex; |
||||||
|
private int mGLTextureCoordinateIndex; |
||||||
|
private int mGLTextureTransformIndex; |
||||||
|
|
||||||
|
protected int mInputWidth; |
||||||
|
protected int mInputHeight; |
||||||
|
protected int mOutputWidth; |
||||||
|
protected int mOutputHeight; |
||||||
|
protected FloatBuffer mGLCubeBuffer; |
||||||
|
protected FloatBuffer mGLTextureBuffer; |
||||||
|
|
||||||
|
private int[] mGLCubeId; |
||||||
|
private int[] mGLTextureCoordinateId; |
||||||
|
private float[] mGLTextureTransformMatrix; |
||||||
|
|
||||||
|
private int[] mGLFboId; |
||||||
|
private int[] mGLFboTexId; |
||||||
|
private IntBuffer mGLFboBuffer; |
||||||
|
|
||||||
|
public GPUImageFilter() { |
||||||
|
this(MagicFilterType.NONE); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageFilter(MagicFilterType type) { |
||||||
|
this(type, R.raw.vertex, R.raw.fragment); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageFilter(MagicFilterType type, int fragmentShaderId) { |
||||||
|
this(type, R.raw.vertex, fragmentShaderId); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageFilter(MagicFilterType type, int vertexShaderId, int fragmentShaderId) { |
||||||
|
mType = type; |
||||||
|
mRunOnDraw = new LinkedList<>(); |
||||||
|
mVertexShaderId = vertexShaderId; |
||||||
|
mFragmentShaderId = fragmentShaderId; |
||||||
|
|
||||||
|
mGLCubeBuffer = ByteBuffer.allocateDirect(TextureRotationUtil.CUBE.length * 4) |
||||||
|
.order(ByteOrder.nativeOrder()) |
||||||
|
.asFloatBuffer(); |
||||||
|
mGLCubeBuffer.put(TextureRotationUtil.CUBE).position(0); |
||||||
|
|
||||||
|
mGLTextureBuffer = ByteBuffer.allocateDirect(TextureRotationUtil.TEXTURE_NO_ROTATION.length * 4) |
||||||
|
.order(ByteOrder.nativeOrder()) |
||||||
|
.asFloatBuffer(); |
||||||
|
mGLTextureBuffer.put(TextureRotationUtil.getRotation(Rotation.NORMAL, false, true)).position(0); |
||||||
|
} |
||||||
|
|
||||||
|
public void init(Context context) { |
||||||
|
mContext = context; |
||||||
|
onInit(); |
||||||
|
onInitialized(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInit() { |
||||||
|
initVbo(); |
||||||
|
loadSamplerShader(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInitialized() { |
||||||
|
mIsInitialized = true; |
||||||
|
} |
||||||
|
|
||||||
|
public final void destroy() { |
||||||
|
mIsInitialized = false; |
||||||
|
destroyFboTexture(); |
||||||
|
destoryVbo(); |
||||||
|
GLES20.glDeleteProgram(mGLProgId); |
||||||
|
onDestroy(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDestroy() { |
||||||
|
} |
||||||
|
|
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
mInputWidth = width; |
||||||
|
mInputHeight = height; |
||||||
|
initFboTexture(width, height); |
||||||
|
} |
||||||
|
|
||||||
|
public void onDisplaySizeChanged(final int width, final int height) { |
||||||
|
mOutputWidth = width; |
||||||
|
mOutputHeight = height; |
||||||
|
} |
||||||
|
|
||||||
|
private void loadSamplerShader() { |
||||||
|
mGLProgId = OpenGLUtils.loadProgram(OpenGLUtils.readShaderFromRawResource(getContext(), mVertexShaderId), |
||||||
|
OpenGLUtils.readShaderFromRawResource(getContext(), mFragmentShaderId)); |
||||||
|
mGLPositionIndex = GLES20.glGetAttribLocation(mGLProgId, "position"); |
||||||
|
mGLTextureCoordinateIndex = GLES20.glGetAttribLocation(mGLProgId,"inputTextureCoordinate"); |
||||||
|
mGLTextureTransformIndex = GLES20.glGetUniformLocation(mGLProgId, "textureTransform"); |
||||||
|
mGLInputImageTextureIndex = GLES20.glGetUniformLocation(mGLProgId, "inputImageTexture"); |
||||||
|
} |
||||||
|
|
||||||
|
private void initVbo() { |
||||||
|
mGLCubeId = new int[1]; |
||||||
|
mGLTextureCoordinateId = new int[1]; |
||||||
|
|
||||||
|
GLES20.glGenBuffers(1, mGLCubeId, 0); |
||||||
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLCubeId[0]); |
||||||
|
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mGLCubeBuffer.capacity() * 4, mGLCubeBuffer, GLES20.GL_STATIC_DRAW); |
||||||
|
|
||||||
|
GLES20.glGenBuffers(1, mGLTextureCoordinateId, 0); |
||||||
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLTextureCoordinateId[0]); |
||||||
|
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mGLTextureBuffer.capacity() * 4, mGLTextureBuffer, GLES20.GL_STATIC_DRAW); |
||||||
|
} |
||||||
|
|
||||||
|
private void destoryVbo() { |
||||||
|
if (mGLCubeId != null) { |
||||||
|
GLES20.glDeleteBuffers(1, mGLCubeId, 0); |
||||||
|
mGLCubeId = null; |
||||||
|
} |
||||||
|
if (mGLTextureCoordinateId != null) { |
||||||
|
GLES20.glDeleteBuffers(1, mGLTextureCoordinateId, 0); |
||||||
|
mGLTextureCoordinateId = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void initFboTexture(int width, int height) { |
||||||
|
if (mGLFboId != null && (mInputWidth != width || mInputHeight != height)) { |
||||||
|
destroyFboTexture(); |
||||||
|
} |
||||||
|
|
||||||
|
mGLFboId = new int[1]; |
||||||
|
mGLFboTexId = new int[1]; |
||||||
|
mGLFboBuffer = IntBuffer.allocate(width * height); |
||||||
|
|
||||||
|
GLES20.glGenFramebuffers(1, mGLFboId, 0); |
||||||
|
GLES20.glGenTextures(1, mGLFboTexId, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mGLFboTexId[0]); |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mGLFboId[0]); |
||||||
|
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, mGLFboTexId[0], 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); |
||||||
|
} |
||||||
|
|
||||||
|
private void destroyFboTexture() { |
||||||
|
if (mGLFboTexId != null) { |
||||||
|
GLES20.glDeleteTextures(1, mGLFboTexId, 0); |
||||||
|
mGLFboTexId = null; |
||||||
|
} |
||||||
|
if (mGLFboId != null) { |
||||||
|
GLES20.glDeleteFramebuffers(1, mGLFboId, 0); |
||||||
|
mGLFboId = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int onDrawFrame(final int textureId, final FloatBuffer cubeBuffer, final FloatBuffer textureBuffer) { |
||||||
|
if (!mIsInitialized) { |
||||||
|
return OpenGLUtils.NOT_INIT; |
||||||
|
} |
||||||
|
|
||||||
|
GLES20.glUseProgram(mGLProgId); |
||||||
|
runPendingOnDrawTasks(); |
||||||
|
|
||||||
|
GLES20.glEnableVertexAttribArray(mGLPositionIndex); |
||||||
|
GLES20.glVertexAttribPointer(mGLPositionIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, cubeBuffer); |
||||||
|
|
||||||
|
GLES20.glEnableVertexAttribArray(mGLTextureCoordinateIndex); |
||||||
|
GLES20.glVertexAttribPointer(mGLTextureCoordinateIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, textureBuffer); |
||||||
|
|
||||||
|
if (textureId != OpenGLUtils.NO_TEXTURE) { |
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); |
||||||
|
GLES20.glUniform1i(mGLInputImageTextureIndex, 0); |
||||||
|
} |
||||||
|
|
||||||
|
onDrawArraysPre(); |
||||||
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); |
||||||
|
onDrawArraysAfter(); |
||||||
|
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); |
||||||
|
|
||||||
|
GLES20.glDisableVertexAttribArray(mGLPositionIndex); |
||||||
|
GLES20.glDisableVertexAttribArray(mGLTextureCoordinateIndex); |
||||||
|
|
||||||
|
return OpenGLUtils.ON_DRAWN; |
||||||
|
} |
||||||
|
|
||||||
|
public int onDrawFrame(int cameraTextureId) { |
||||||
|
if (!mIsInitialized) { |
||||||
|
return OpenGLUtils.NOT_INIT; |
||||||
|
} |
||||||
|
|
||||||
|
if (mGLFboId == null) { |
||||||
|
return OpenGLUtils.NO_TEXTURE; |
||||||
|
} |
||||||
|
|
||||||
|
GLES20.glUseProgram(mGLProgId); |
||||||
|
runPendingOnDrawTasks(); |
||||||
|
|
||||||
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLCubeId[0]); |
||||||
|
GLES20.glEnableVertexAttribArray(mGLPositionIndex); |
||||||
|
GLES20.glVertexAttribPointer(mGLPositionIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, 0); |
||||||
|
|
||||||
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLTextureCoordinateId[0]); |
||||||
|
GLES20.glEnableVertexAttribArray(mGLTextureCoordinateIndex); |
||||||
|
GLES20.glVertexAttribPointer(mGLTextureCoordinateIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, 0); |
||||||
|
|
||||||
|
GLES20.glUniformMatrix4fv(mGLTextureTransformIndex, 1, false, mGLTextureTransformMatrix, 0); |
||||||
|
|
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
||||||
|
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, cameraTextureId); |
||||||
|
GLES20.glUniform1i(mGLInputImageTextureIndex, 0); |
||||||
|
|
||||||
|
onDrawArraysPre(); |
||||||
|
|
||||||
|
GLES20.glViewport(0, 0, mInputWidth, mInputHeight); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mGLFboId[0]); |
||||||
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); |
||||||
|
|
||||||
|
GLES20.glReadPixels(0, 0, mInputWidth, mInputHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mGLFboBuffer); |
||||||
|
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); |
||||||
|
GLES20.glViewport(0, 0, mOutputWidth, mOutputHeight); |
||||||
|
|
||||||
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); |
||||||
|
|
||||||
|
onDrawArraysAfter(); |
||||||
|
|
||||||
|
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); |
||||||
|
|
||||||
|
GLES20.glDisableVertexAttribArray(mGLPositionIndex); |
||||||
|
GLES20.glDisableVertexAttribArray(mGLTextureCoordinateIndex); |
||||||
|
|
||||||
|
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); |
||||||
|
|
||||||
|
return mGLFboTexId[0]; |
||||||
|
} |
||||||
|
|
||||||
|
protected void onDrawArraysPre() {} |
||||||
|
|
||||||
|
protected void onDrawArraysAfter() {} |
||||||
|
|
||||||
|
private void runPendingOnDrawTasks() { |
||||||
|
while (!mRunOnDraw.isEmpty()) { |
||||||
|
mRunOnDraw.removeFirst().run(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int getProgram() { |
||||||
|
return mGLProgId; |
||||||
|
} |
||||||
|
|
||||||
|
public IntBuffer getGLFboBuffer() { |
||||||
|
return mGLFboBuffer; |
||||||
|
} |
||||||
|
|
||||||
|
protected Context getContext() { |
||||||
|
return mContext; |
||||||
|
} |
||||||
|
|
||||||
|
protected MagicFilterType getFilterType() { |
||||||
|
return mType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTextureTransformMatrix(float[] mtx){ |
||||||
|
mGLTextureTransformMatrix = mtx; |
||||||
|
} |
||||||
|
|
||||||
|
protected void setInteger(final int location, final int intValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform1i(location, intValue); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setFloat(final int location, final float floatValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform1f(location, floatValue); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setFloatVec2(final int location, final float[] arrayValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform2fv(location, 1, FloatBuffer.wrap(arrayValue)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setFloatVec3(final int location, final float[] arrayValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform3fv(location, 1, FloatBuffer.wrap(arrayValue)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setFloatVec4(final int location, final float[] arrayValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform4fv(location, 1, FloatBuffer.wrap(arrayValue)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setFloatArray(final int location, final float[] arrayValue) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniform1fv(location, arrayValue.length, FloatBuffer.wrap(arrayValue)); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setPoint(final int location, final PointF point) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
float[] vec2 = new float[2]; |
||||||
|
vec2[0] = point.x; |
||||||
|
vec2[1] = point.y; |
||||||
|
GLES20.glUniform2fv(location, 1, vec2, 0); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setUniformMatrix3f(final int location, final float[] matrix) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniformMatrix3fv(location, 1, false, matrix, 0); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void setUniformMatrix4f(final int location, final float[] matrix) { |
||||||
|
runOnDraw(new Runnable() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
GLES20.glUniformMatrix4fv(location, 1, false, matrix, 0); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void runOnDraw(final Runnable runnable) { |
||||||
|
synchronized (mRunOnDraw) { |
||||||
|
mRunOnDraw.addLast(runnable); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,55 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
public class GPUImageHueFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private float mHue; |
||||||
|
private int mHueLocation; |
||||||
|
|
||||||
|
public GPUImageHueFilter() { |
||||||
|
this(0.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageHueFilter(final float hue) { |
||||||
|
super(MagicFilterType.HUE, R.raw.hue); |
||||||
|
mHue = hue; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mHueLocation = GLES20.glGetUniformLocation(getProgram(), "hueAdjust"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setHue(mHue); |
||||||
|
} |
||||||
|
|
||||||
|
public void setHue(final float hue) { |
||||||
|
mHue = hue; |
||||||
|
float hueAdjust = (mHue % 360.0f) * (float) Math.PI / 180.0f; |
||||||
|
setFloat(mHueLocation, hueAdjust); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
/** |
||||||
|
* saturation: The degree of saturation or desaturation to apply to the image (0.0 - 2.0, with 1.0 as the default) |
||||||
|
*/ |
||||||
|
public class GPUImageSaturationFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mSaturationLocation; |
||||||
|
private float mSaturation; |
||||||
|
|
||||||
|
public GPUImageSaturationFilter() { |
||||||
|
this(1.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageSaturationFilter(final float saturation) { |
||||||
|
super(MagicFilterType.SATURATION, R.raw.saturation); |
||||||
|
mSaturation = saturation; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mSaturationLocation = GLES20.glGetUniformLocation(getProgram(), "saturation"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setSaturation(mSaturation); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSaturation(final float saturation) { |
||||||
|
mSaturation = saturation; |
||||||
|
setFloat(mSaturationLocation, mSaturation); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.base.gpuimage; |
||||||
|
|
||||||
|
import android.opengl.GLES20; |
||||||
|
|
||||||
|
import com.frank.live.R; |
||||||
|
import com.seu.magicfilter.utils.MagicFilterType; |
||||||
|
|
||||||
|
/** |
||||||
|
* Sharpens the picture. <br> |
||||||
|
* <br> |
||||||
|
* sharpness: from -4.0 to 4.0, with 0.0 as the normal level |
||||||
|
*/ |
||||||
|
public class GPUImageSharpenFilter extends GPUImageFilter { |
||||||
|
|
||||||
|
private int mSharpnessLocation; |
||||||
|
private float mSharpness; |
||||||
|
private int mImageWidthFactorLocation; |
||||||
|
private int mImageHeightFactorLocation; |
||||||
|
|
||||||
|
public GPUImageSharpenFilter() { |
||||||
|
this(0.0f); |
||||||
|
} |
||||||
|
|
||||||
|
public GPUImageSharpenFilter(final float sharpness) { |
||||||
|
super(MagicFilterType.SHARPEN, R.raw.vertex_sharpen, R.raw.sharpen); |
||||||
|
mSharpness = sharpness; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInit() { |
||||||
|
super.onInit(); |
||||||
|
mSharpnessLocation = GLES20.glGetUniformLocation(getProgram(), "sharpness"); |
||||||
|
mImageWidthFactorLocation = GLES20.glGetUniformLocation(getProgram(), "imageWidthFactor"); |
||||||
|
mImageHeightFactorLocation = GLES20.glGetUniformLocation(getProgram(), "imageHeightFactor"); |
||||||
|
setSharpness(mSharpness); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(final int width, final int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
setFloat(mImageWidthFactorLocation, 1.0f / width); |
||||||
|
setFloat(mImageHeightFactorLocation, 1.0f / height); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSharpness(final float sharpness) { |
||||||
|
mSharpness = sharpness; |
||||||
|
setFloat(mSharpnessLocation, mSharpness); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,163 @@ |
|||||||
|
package com.seu.magicfilter.utils; |
||||||
|
|
||||||
|
import com.seu.magicfilter.advanced.MagicAmaroFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicAntiqueFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicBeautyFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicBlackCatFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicBrannanFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicBrooklynFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicCalmFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicCoolFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicCrayonFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicEarlyBirdFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicEmeraldFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicEvergreenFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicFreudFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicHealthyFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicHefeFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicHudsonFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicImageAdjustFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicInkwellFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicKevinFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicLatteFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicLomoFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicN1977Filter; |
||||||
|
import com.seu.magicfilter.advanced.MagicNashvilleFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicNostalgiaFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicPixelFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicRiseFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicRomanceFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSakuraFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSierraFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSketchFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSkinWhitenFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSunriseFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSunsetFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSutroFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicSweetsFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicTenderFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicToasterFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicValenciaFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicWaldenFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicWarmFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicWhiteCatFilter; |
||||||
|
import com.seu.magicfilter.advanced.MagicXproIIFilter; |
||||||
|
import com.seu.magicfilter.base.MagicLookupFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageBrightnessFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageContrastFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageExposureFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageHueFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageSaturationFilter; |
||||||
|
import com.seu.magicfilter.base.gpuimage.GPUImageSharpenFilter; |
||||||
|
|
||||||
|
public class MagicFilterFactory{ |
||||||
|
|
||||||
|
public static GPUImageFilter initFilters(MagicFilterType type) { |
||||||
|
switch (type) { |
||||||
|
case NONE: |
||||||
|
return new GPUImageFilter(); |
||||||
|
case WHITECAT: |
||||||
|
return new MagicWhiteCatFilter(); |
||||||
|
case BLACKCAT: |
||||||
|
return new MagicBlackCatFilter(); |
||||||
|
case SKINWHITEN: |
||||||
|
return new MagicSkinWhitenFilter(); |
||||||
|
case BEAUTY: |
||||||
|
return new MagicBeautyFilter(); |
||||||
|
case ROMANCE: |
||||||
|
return new MagicRomanceFilter(); |
||||||
|
case SAKURA: |
||||||
|
return new MagicSakuraFilter(); |
||||||
|
case AMARO: |
||||||
|
return new MagicAmaroFilter(); |
||||||
|
case WALDEN: |
||||||
|
return new MagicWaldenFilter(); |
||||||
|
case ANTIQUE: |
||||||
|
return new MagicAntiqueFilter(); |
||||||
|
case CALM: |
||||||
|
return new MagicCalmFilter(); |
||||||
|
case BRANNAN: |
||||||
|
return new MagicBrannanFilter(); |
||||||
|
case BROOKLYN: |
||||||
|
return new MagicBrooklynFilter(); |
||||||
|
case EARLYBIRD: |
||||||
|
return new MagicEarlyBirdFilter(); |
||||||
|
case FREUD: |
||||||
|
return new MagicFreudFilter(); |
||||||
|
case HEFE: |
||||||
|
return new MagicHefeFilter(); |
||||||
|
case HUDSON: |
||||||
|
return new MagicHudsonFilter(); |
||||||
|
case INKWELL: |
||||||
|
return new MagicInkwellFilter(); |
||||||
|
case KEVIN: |
||||||
|
return new MagicKevinFilter(); |
||||||
|
case LOCKUP: |
||||||
|
return new MagicLookupFilter(""); |
||||||
|
case LOMO: |
||||||
|
return new MagicLomoFilter(); |
||||||
|
case N1977: |
||||||
|
return new MagicN1977Filter(); |
||||||
|
case NASHVILLE: |
||||||
|
return new MagicNashvilleFilter(); |
||||||
|
case PIXAR: |
||||||
|
return new MagicPixelFilter(); |
||||||
|
case RISE: |
||||||
|
return new MagicRiseFilter(); |
||||||
|
case SIERRA: |
||||||
|
return new MagicSierraFilter(); |
||||||
|
case SUTRO: |
||||||
|
return new MagicSutroFilter(); |
||||||
|
case TOASTER2: |
||||||
|
return new MagicToasterFilter(); |
||||||
|
case VALENCIA: |
||||||
|
return new MagicValenciaFilter(); |
||||||
|
case XPROII: |
||||||
|
return new MagicXproIIFilter(); |
||||||
|
case EVERGREEN: |
||||||
|
return new MagicEvergreenFilter(); |
||||||
|
case HEALTHY: |
||||||
|
return new MagicHealthyFilter(); |
||||||
|
case COOL: |
||||||
|
return new MagicCoolFilter(); |
||||||
|
case EMERALD: |
||||||
|
return new MagicEmeraldFilter(); |
||||||
|
case LATTE: |
||||||
|
return new MagicLatteFilter(); |
||||||
|
case WARM: |
||||||
|
return new MagicWarmFilter(); |
||||||
|
case TENDER: |
||||||
|
return new MagicTenderFilter(); |
||||||
|
case SWEETS: |
||||||
|
return new MagicSweetsFilter(); |
||||||
|
case NOSTALGIA: |
||||||
|
return new MagicNostalgiaFilter(); |
||||||
|
case SUNRISE: |
||||||
|
return new MagicSunriseFilter(); |
||||||
|
case SUNSET: |
||||||
|
return new MagicSunsetFilter(); |
||||||
|
case CRAYON: |
||||||
|
return new MagicCrayonFilter(); |
||||||
|
case SKETCH: |
||||||
|
return new MagicSketchFilter(); |
||||||
|
//image adjust
|
||||||
|
case BRIGHTNESS: |
||||||
|
return new GPUImageBrightnessFilter(); |
||||||
|
case CONTRAST: |
||||||
|
return new GPUImageContrastFilter(); |
||||||
|
case EXPOSURE: |
||||||
|
return new GPUImageExposureFilter(); |
||||||
|
case HUE: |
||||||
|
return new GPUImageHueFilter(); |
||||||
|
case SATURATION: |
||||||
|
return new GPUImageSaturationFilter(); |
||||||
|
case SHARPEN: |
||||||
|
return new GPUImageSharpenFilter(); |
||||||
|
case IMAGE_ADJUST: |
||||||
|
return new MagicImageAdjustFilter(); |
||||||
|
default: |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,59 @@ |
|||||||
|
package com.seu.magicfilter.utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by why8222 on 2016/2/25. |
||||||
|
*/ |
||||||
|
public enum MagicFilterType { |
||||||
|
NONE, |
||||||
|
FAIRYTALE, |
||||||
|
SUNRISE, |
||||||
|
SUNSET, |
||||||
|
WHITECAT, |
||||||
|
BLACKCAT, |
||||||
|
SKINWHITEN, |
||||||
|
BEAUTY, |
||||||
|
HEALTHY, |
||||||
|
SWEETS, |
||||||
|
ROMANCE, |
||||||
|
SAKURA, |
||||||
|
WARM, |
||||||
|
ANTIQUE, |
||||||
|
NOSTALGIA, |
||||||
|
CALM, |
||||||
|
LATTE, |
||||||
|
TENDER, |
||||||
|
COOL, |
||||||
|
EMERALD, |
||||||
|
EVERGREEN, |
||||||
|
CRAYON, |
||||||
|
SKETCH, |
||||||
|
AMARO, |
||||||
|
BRANNAN, |
||||||
|
BROOKLYN, |
||||||
|
EARLYBIRD, |
||||||
|
FREUD, |
||||||
|
HEFE, |
||||||
|
HUDSON, |
||||||
|
INKWELL, |
||||||
|
KEVIN, |
||||||
|
LOCKUP, |
||||||
|
LOMO, |
||||||
|
N1977, |
||||||
|
NASHVILLE, |
||||||
|
PIXAR, |
||||||
|
RISE, |
||||||
|
SIERRA, |
||||||
|
SUTRO, |
||||||
|
TOASTER2, |
||||||
|
VALENCIA, |
||||||
|
WALDEN, |
||||||
|
XPROII, |
||||||
|
//image adjust
|
||||||
|
CONTRAST, |
||||||
|
BRIGHTNESS, |
||||||
|
EXPOSURE, |
||||||
|
HUE, |
||||||
|
SATURATION, |
||||||
|
SHARPEN, |
||||||
|
IMAGE_ADJUST |
||||||
|
} |
||||||
@ -0,0 +1,230 @@ |
|||||||
|
package com.seu.magicfilter.utils; |
||||||
|
|
||||||
|
import android.content.Context; |
||||||
|
import android.content.res.AssetManager; |
||||||
|
import android.graphics.Bitmap; |
||||||
|
import android.graphics.BitmapFactory; |
||||||
|
import android.opengl.GLES11Ext; |
||||||
|
import android.opengl.GLES20; |
||||||
|
import android.opengl.GLUtils; |
||||||
|
import android.util.Log; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.nio.Buffer; |
||||||
|
|
||||||
|
import javax.microedition.khronos.opengles.GL10; |
||||||
|
|
||||||
|
public class OpenGLUtils { |
||||||
|
public static final int NO_TEXTURE = -1; |
||||||
|
public static final int NOT_INIT = -1; |
||||||
|
public static final int ON_DRAWN = 1; |
||||||
|
|
||||||
|
public static int loadTexture(Bitmap img, int usedTexId) { |
||||||
|
return loadTexture(img, usedTexId, false); |
||||||
|
} |
||||||
|
|
||||||
|
public static int loadTexture(Bitmap img, int usedTexId, boolean recyled) { |
||||||
|
if(img == null) |
||||||
|
return NO_TEXTURE; |
||||||
|
int textures[] = new int[1]; |
||||||
|
if (usedTexId == NO_TEXTURE) { |
||||||
|
GLES20.glGenTextures(1, textures, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
|
||||||
|
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img, 0); |
||||||
|
} else { |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId); |
||||||
|
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, img); |
||||||
|
textures[0] = usedTexId; |
||||||
|
} |
||||||
|
if(recyled) |
||||||
|
img.recycle(); |
||||||
|
return textures[0]; |
||||||
|
} |
||||||
|
|
||||||
|
public static int loadTexture(Buffer data, int width, int height, int usedTexId) { |
||||||
|
if(data == null) |
||||||
|
return NO_TEXTURE; |
||||||
|
int textures[] = new int[1]; |
||||||
|
if (usedTexId == NO_TEXTURE) { |
||||||
|
GLES20.glGenTextures(1, textures, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, |
||||||
|
0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data); |
||||||
|
} else { |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId); |
||||||
|
GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, width, |
||||||
|
height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data); |
||||||
|
textures[0] = usedTexId; |
||||||
|
} |
||||||
|
return textures[0]; |
||||||
|
} |
||||||
|
|
||||||
|
public static int loadTexture(Buffer data, int width, int height, int usedTexId, int type) { |
||||||
|
if(data == null) |
||||||
|
return NO_TEXTURE; |
||||||
|
int textures[] = new int[1]; |
||||||
|
if (usedTexId == NO_TEXTURE) { |
||||||
|
GLES20.glGenTextures(1, textures, 0); |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, |
||||||
|
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, |
||||||
|
0, GLES20.GL_RGBA, type, data); |
||||||
|
} else { |
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId); |
||||||
|
GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, width, |
||||||
|
height, GLES20.GL_RGBA, type, data); |
||||||
|
textures[0] = usedTexId; |
||||||
|
} |
||||||
|
return textures[0]; |
||||||
|
} |
||||||
|
|
||||||
|
public static int loadTexture(final Context context, final String name){ |
||||||
|
final int[] textureHandle = new int[1]; |
||||||
|
|
||||||
|
GLES20.glGenTextures(1, textureHandle, 0); |
||||||
|
|
||||||
|
if (textureHandle[0] != 0){ |
||||||
|
|
||||||
|
// Read in the resource
|
||||||
|
final Bitmap bitmap = getImageFromAssetsFile(context,name); |
||||||
|
|
||||||
|
// Bind to the texture in OpenGL
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); |
||||||
|
|
||||||
|
// Set filtering
|
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); |
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); |
||||||
|
// Load the bitmap into the bound texture.
|
||||||
|
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); |
||||||
|
|
||||||
|
// Recycle the bitmap, since its data has been loaded into OpenGL.
|
||||||
|
bitmap.recycle(); |
||||||
|
} |
||||||
|
|
||||||
|
if (textureHandle[0] == 0){ |
||||||
|
throw new RuntimeException("Error loading texture."); |
||||||
|
} |
||||||
|
|
||||||
|
return textureHandle[0]; |
||||||
|
} |
||||||
|
|
||||||
|
private static Bitmap getImageFromAssetsFile(Context context, String fileName){ |
||||||
|
Bitmap image = null; |
||||||
|
AssetManager am = context.getResources().getAssets(); |
||||||
|
try{ |
||||||
|
InputStream is = am.open(fileName); |
||||||
|
image = BitmapFactory.decodeStream(is); |
||||||
|
is.close(); |
||||||
|
}catch (IOException e){ |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return image; |
||||||
|
} |
||||||
|
|
||||||
|
public static int loadProgram(String strVSource, String strFSource) { |
||||||
|
int iVShader; |
||||||
|
int iFShader; |
||||||
|
int iProgId; |
||||||
|
int[] link = new int[1]; |
||||||
|
iVShader = loadShader(strVSource, GLES20.GL_VERTEX_SHADER); |
||||||
|
if (iVShader == 0) { |
||||||
|
Log.d("Load Program", "Vertex Shader Failed"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
iFShader = loadShader(strFSource, GLES20.GL_FRAGMENT_SHADER); |
||||||
|
if (iFShader == 0) { |
||||||
|
Log.d("Load Program", "Fragment Shader Failed"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
iProgId = GLES20.glCreateProgram(); |
||||||
|
GLES20.glAttachShader(iProgId, iVShader); |
||||||
|
GLES20.glAttachShader(iProgId, iFShader); |
||||||
|
GLES20.glLinkProgram(iProgId); |
||||||
|
GLES20.glGetProgramiv(iProgId, GLES20.GL_LINK_STATUS, link, 0); |
||||||
|
if (link[0] <= 0) { |
||||||
|
Log.d("Load Program", "Linking Failed"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
GLES20.glDeleteShader(iVShader); |
||||||
|
GLES20.glDeleteShader(iFShader); |
||||||
|
return iProgId; |
||||||
|
} |
||||||
|
|
||||||
|
private static int loadShader(String strSource, int iType) { |
||||||
|
int[] compiled = new int[1]; |
||||||
|
int iShader = GLES20.glCreateShader(iType); |
||||||
|
GLES20.glShaderSource(iShader, strSource); |
||||||
|
GLES20.glCompileShader(iShader); |
||||||
|
GLES20.glGetShaderiv(iShader, GLES20.GL_COMPILE_STATUS, compiled, 0); |
||||||
|
if (compiled[0] == 0) { |
||||||
|
Log.e("Load Shader Failed", "Compilation\n" + GLES20.glGetShaderInfoLog(iShader)); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return iShader; |
||||||
|
} |
||||||
|
|
||||||
|
public static int getExternalOESTextureID(){ |
||||||
|
int[] texture = new int[1]; |
||||||
|
GLES20.glGenTextures(1, texture, 0); |
||||||
|
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texture[0]); |
||||||
|
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, |
||||||
|
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); |
||||||
|
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, |
||||||
|
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); |
||||||
|
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, |
||||||
|
GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); |
||||||
|
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, |
||||||
|
GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); |
||||||
|
return texture[0]; |
||||||
|
} |
||||||
|
|
||||||
|
public static String readShaderFromRawResource(Context context, int resourceId){ |
||||||
|
final InputStream inputStream = context.getResources().openRawResource(resourceId); |
||||||
|
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream); |
||||||
|
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader); |
||||||
|
|
||||||
|
String nextLine; |
||||||
|
final StringBuilder body = new StringBuilder(); |
||||||
|
|
||||||
|
try{ |
||||||
|
while ((nextLine = bufferedReader.readLine()) != null){ |
||||||
|
body.append(nextLine); |
||||||
|
body.append('\n'); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (IOException e){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
return body.toString(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.utils; |
||||||
|
|
||||||
|
public enum Rotation { |
||||||
|
NORMAL, ROTATION_90, ROTATION_180, ROTATION_270; |
||||||
|
|
||||||
|
/** |
||||||
|
* Retrieves the int representation of the Rotation. |
||||||
|
* |
||||||
|
* @return 0, 90, 180 or 270 |
||||||
|
*/ |
||||||
|
public int asInt() { |
||||||
|
switch (this) { |
||||||
|
case NORMAL: return 0; |
||||||
|
case ROTATION_90: return 90; |
||||||
|
case ROTATION_180: return 180; |
||||||
|
case ROTATION_270: return 270; |
||||||
|
default: throw new IllegalStateException("Unknown Rotation!"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a Rotation from an integer. Needs to be either 0, 90, 180 or 270. |
||||||
|
* |
||||||
|
* @param rotation 0, 90, 180 or 270 |
||||||
|
* @return Rotation object |
||||||
|
*/ |
||||||
|
public static Rotation fromInt(int rotation) { |
||||||
|
switch (rotation) { |
||||||
|
case 0: return NORMAL; |
||||||
|
case 90: return ROTATION_90; |
||||||
|
case 180: return ROTATION_180; |
||||||
|
case 270: return ROTATION_270; |
||||||
|
case 360: return NORMAL; |
||||||
|
default: throw new IllegalStateException( |
||||||
|
rotation + " is an unknown rotation. Needs to be either 0, 90, 180 or 270!"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,96 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2012 CyberAgent |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.seu.magicfilter.utils; |
||||||
|
|
||||||
|
public class TextureRotationUtil { |
||||||
|
|
||||||
|
public static final float TEXTURE_NO_ROTATION[] = { |
||||||
|
0.0f, 1.0f, |
||||||
|
1.0f, 1.0f, |
||||||
|
0.0f, 0.0f, |
||||||
|
1.0f, 0.0f, |
||||||
|
}; |
||||||
|
|
||||||
|
public static final float TEXTURE_ROTATED_90[] = { |
||||||
|
1.0f, 1.0f, |
||||||
|
1.0f, 0.0f, |
||||||
|
0.0f, 1.0f, |
||||||
|
0.0f, 0.0f, |
||||||
|
}; |
||||||
|
public static final float TEXTURE_ROTATED_180[] = { |
||||||
|
1.0f, 0.0f, |
||||||
|
0.0f, 0.0f, |
||||||
|
1.0f, 1.0f, |
||||||
|
0.0f, 1.0f, |
||||||
|
}; |
||||||
|
public static final float TEXTURE_ROTATED_270[] = { |
||||||
|
0.0f, 0.0f, |
||||||
|
0.0f, 1.0f, |
||||||
|
1.0f, 0.0f, |
||||||
|
1.0f, 1.0f, |
||||||
|
}; |
||||||
|
|
||||||
|
public static final float CUBE[] = { |
||||||
|
-1.0f, -1.0f, |
||||||
|
1.0f, -1.0f, |
||||||
|
-1.0f, 1.0f, |
||||||
|
1.0f, 1.0f, |
||||||
|
}; |
||||||
|
|
||||||
|
private TextureRotationUtil() {} |
||||||
|
|
||||||
|
public static float[] getRotation(final Rotation rotation, final boolean flipHorizontal, |
||||||
|
final boolean flipVertical) { |
||||||
|
float[] rotatedTex; |
||||||
|
switch (rotation) { |
||||||
|
case ROTATION_90: |
||||||
|
rotatedTex = TEXTURE_ROTATED_90; |
||||||
|
break; |
||||||
|
case ROTATION_180: |
||||||
|
rotatedTex = TEXTURE_ROTATED_180; |
||||||
|
break; |
||||||
|
case ROTATION_270: |
||||||
|
rotatedTex = TEXTURE_ROTATED_270; |
||||||
|
break; |
||||||
|
case NORMAL: |
||||||
|
default: |
||||||
|
rotatedTex = TEXTURE_NO_ROTATION; |
||||||
|
break; |
||||||
|
} |
||||||
|
if (flipHorizontal) { |
||||||
|
rotatedTex = new float[]{ |
||||||
|
flip(rotatedTex[0]), rotatedTex[1], |
||||||
|
flip(rotatedTex[2]), rotatedTex[3], |
||||||
|
flip(rotatedTex[4]), rotatedTex[5], |
||||||
|
flip(rotatedTex[6]), rotatedTex[7], |
||||||
|
}; |
||||||
|
} |
||||||
|
if (flipVertical) { |
||||||
|
rotatedTex = new float[]{ |
||||||
|
rotatedTex[0], flip(rotatedTex[1]), |
||||||
|
rotatedTex[2], flip(rotatedTex[3]), |
||||||
|
rotatedTex[4], flip(rotatedTex[5]), |
||||||
|
rotatedTex[6], flip(rotatedTex[7]), |
||||||
|
}; |
||||||
|
} |
||||||
|
return rotatedTex; |
||||||
|
} |
||||||
|
|
||||||
|
private static float flip(final float i) { |
||||||
|
return i == 0.0f ? 1.0f : 0.0f; |
||||||
|
} |
||||||
|
} |
||||||
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,40 @@ |
|||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" > |
||||||
|
|
||||||
|
<com.frank.live.view.SmartCameraView |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:id="@+id/gl_surfaceview" |
||||||
|
android:layout_alignParentBottom="true" |
||||||
|
android:layout_alignParentLeft="true" |
||||||
|
android:layout_alignParentTop="true" |
||||||
|
android:layout_alignParentRight="true" /> |
||||||
|
|
||||||
|
<Spinner |
||||||
|
android:id="@+id/beauty_type_selctor" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginTop="20dp"/> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:id="@+id/img_photo" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_alignParentRight="true" |
||||||
|
android:src="@drawable/ic_camera_switch" |
||||||
|
android:text="拍照" |
||||||
|
android:clickable="true" |
||||||
|
android:focusable="true" |
||||||
|
android:tint="@color/colorPrimary" /> |
||||||
|
|
||||||
|
<Button |
||||||
|
android:id="@+id/button_mute" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:text=" 静音" |
||||||
|
android:layout_alignParentRight="true" |
||||||
|
android:layout_marginTop="10dp" |
||||||
|
android:layout_below="@+id/img_photo"/> |
||||||
|
|
||||||
|
</RelativeLayout> |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //blowout; |
||||||
|
uniform sampler2D inputImageTexture3; //overlay; |
||||||
|
uniform sampler2D inputImageTexture4; //map |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 texel = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb; |
||||||
|
|
||||||
|
texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r; |
||||||
|
texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g; |
||||||
|
texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b; |
||||||
|
|
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b; |
||||||
|
mapped.a = 1.0; |
||||||
|
|
||||||
|
mapped.rgb = mix(originColor.rgb, mapped.rgb, strength); |
||||||
|
gl_FragColor = mapped; |
||||||
|
} |
||||||
@ -0,0 +1,53 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
highp vec4 textureColor; |
||||||
|
highp vec4 textureColorRes; |
||||||
|
highp float satVal = 65.0 / 100.0; |
||||||
|
|
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
textureColorRes = textureColor; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
highp float G = (redCurveValue + greenCurveValue + blueCurveValue); |
||||||
|
G = G / 3.0; |
||||||
|
|
||||||
|
redCurveValue = ((1.0 - satVal) * G + satVal * redCurveValue); |
||||||
|
greenCurveValue = ((1.0 - satVal) * G + satVal * greenCurveValue); |
||||||
|
blueCurveValue = ((1.0 - satVal) * G + satVal * blueCurveValue); |
||||||
|
redCurveValue = (((redCurveValue) > (1.0)) ? (1.0) : (((redCurveValue) < (0.0)) ? (0.0) : (redCurveValue))); |
||||||
|
greenCurveValue = (((greenCurveValue) > (1.0)) ? (1.0) : (((greenCurveValue) < (0.0)) ? (0.0) : (greenCurveValue))); |
||||||
|
blueCurveValue = (((blueCurveValue) > (1.0)) ? (1.0) : (((blueCurveValue) < (0.0)) ? (0.0) : (blueCurveValue))); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 0.0)).a; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 0.0)).a; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 0.0)).a; |
||||||
|
|
||||||
|
highp vec4 base = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
highp vec4 overlayer = vec4(250.0/255.0, 227.0/255.0, 193.0/255.0, 1.0); |
||||||
|
|
||||||
|
textureColor = overlayer * base; |
||||||
|
base = (textureColor - base) * 0.850980 + base; |
||||||
|
textureColor = base; |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,111 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform vec2 singleStepOffset; |
||||||
|
|
||||||
|
varying vec2 textureCoordinate; |
||||||
|
|
||||||
|
const vec4 params = vec4(0.748, 0.874, 0.241, 0.241); |
||||||
|
const vec3 W = vec3(0.299,0.587,0.114); |
||||||
|
const mat3 saturateMatrix = mat3( |
||||||
|
1.1102,-0.0598,-0.061, |
||||||
|
-0.0774,1.0826,-0.1186, |
||||||
|
-0.0228,-0.0228,1.1772); |
||||||
|
|
||||||
|
vec2 blurCoordinates[24]; |
||||||
|
|
||||||
|
float hardLight(float color) { |
||||||
|
if(color <= 0.5) { |
||||||
|
color = color * color * 2.0; |
||||||
|
} else { |
||||||
|
color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0); |
||||||
|
} |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
vec3 centralColor = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
|
||||||
|
blurCoordinates[0] = textureCoordinate.xy + singleStepOffset * vec2(0.0, -10.0); |
||||||
|
blurCoordinates[1] = textureCoordinate.xy + singleStepOffset * vec2(0.0, 10.0); |
||||||
|
blurCoordinates[2] = textureCoordinate.xy + singleStepOffset * vec2(-10.0, 0.0); |
||||||
|
blurCoordinates[3] = textureCoordinate.xy + singleStepOffset * vec2(10.0, 0.0); |
||||||
|
blurCoordinates[4] = textureCoordinate.xy + singleStepOffset * vec2(5.0, -8.0); |
||||||
|
blurCoordinates[5] = textureCoordinate.xy + singleStepOffset * vec2(5.0, 8.0); |
||||||
|
blurCoordinates[6] = textureCoordinate.xy + singleStepOffset * vec2(-5.0, 8.0); |
||||||
|
blurCoordinates[7] = textureCoordinate.xy + singleStepOffset * vec2(-5.0, -8.0); |
||||||
|
blurCoordinates[8] = textureCoordinate.xy + singleStepOffset * vec2(8.0, -5.0); |
||||||
|
blurCoordinates[9] = textureCoordinate.xy + singleStepOffset * vec2(8.0, 5.0); |
||||||
|
blurCoordinates[10] = textureCoordinate.xy + singleStepOffset * vec2(-8.0, 5.0); |
||||||
|
blurCoordinates[11] = textureCoordinate.xy + singleStepOffset * vec2(-8.0, -5.0); |
||||||
|
blurCoordinates[12] = textureCoordinate.xy + singleStepOffset * vec2(0.0, -6.0); |
||||||
|
blurCoordinates[13] = textureCoordinate.xy + singleStepOffset * vec2(0.0, 6.0); |
||||||
|
blurCoordinates[14] = textureCoordinate.xy + singleStepOffset * vec2(6.0, 0.0); |
||||||
|
blurCoordinates[15] = textureCoordinate.xy + singleStepOffset * vec2(-6.0, 0.0); |
||||||
|
blurCoordinates[16] = textureCoordinate.xy + singleStepOffset * vec2(-4.0, -4.0); |
||||||
|
blurCoordinates[17] = textureCoordinate.xy + singleStepOffset * vec2(-4.0, 4.0); |
||||||
|
blurCoordinates[18] = textureCoordinate.xy + singleStepOffset * vec2(4.0, -4.0); |
||||||
|
blurCoordinates[19] = textureCoordinate.xy + singleStepOffset * vec2(4.0, 4.0); |
||||||
|
blurCoordinates[20] = textureCoordinate.xy + singleStepOffset * vec2(-2.0, -2.0); |
||||||
|
blurCoordinates[21] = textureCoordinate.xy + singleStepOffset * vec2(-2.0, 2.0); |
||||||
|
blurCoordinates[22] = textureCoordinate.xy + singleStepOffset * vec2(2.0, -2.0); |
||||||
|
blurCoordinates[23] = textureCoordinate.xy + singleStepOffset * vec2(2.0, 2.0); |
||||||
|
|
||||||
|
float sampleColor = centralColor.g * 22.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[0]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[1]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[2]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[3]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[4]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[5]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[6]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[7]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[8]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[9]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[10]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[11]).g; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[12]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[13]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[14]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[15]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[16]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[17]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[18]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[19]).g * 2.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[20]).g * 3.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[21]).g * 3.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[22]).g * 3.0; |
||||||
|
sampleColor += texture2D(inputImageTexture, blurCoordinates[23]).g * 3.0; |
||||||
|
sampleColor = sampleColor / 62.0; |
||||||
|
|
||||||
|
float highPass = centralColor.g - sampleColor + 0.5; |
||||||
|
|
||||||
|
for(int i = 0; i < 5;i++) |
||||||
|
{ |
||||||
|
highPass = hardLight(highPass); |
||||||
|
} |
||||||
|
float luminance = dot(centralColor, W); |
||||||
|
float alpha = pow(luminance, params.r); |
||||||
|
|
||||||
|
vec3 smoothColor = centralColor + (centralColor-vec3(highPass))*alpha*0.1; |
||||||
|
|
||||||
|
smoothColor.r = clamp(pow(smoothColor.r, params.g),0.0,1.0); |
||||||
|
smoothColor.g = clamp(pow(smoothColor.g, params.g),0.0,1.0); |
||||||
|
smoothColor.b = clamp(pow(smoothColor.b, params.g),0.0,1.0); |
||||||
|
|
||||||
|
vec3 screen = vec3(1.0) - (vec3(1.0)-smoothColor) * (vec3(1.0)-centralColor); |
||||||
|
vec3 lighten = max(smoothColor, centralColor); |
||||||
|
vec3 softLight = 2.0 * centralColor*smoothColor + centralColor*centralColor |
||||||
|
- 2.0 * centralColor*centralColor * smoothColor; |
||||||
|
|
||||||
|
gl_FragColor = vec4(mix(centralColor, screen, alpha), 1.0); |
||||||
|
gl_FragColor.rgb = mix(gl_FragColor.rgb, lighten, alpha); |
||||||
|
gl_FragColor.rgb = mix(gl_FragColor.rgb, softLight, params.b); |
||||||
|
|
||||||
|
vec3 satColor = gl_FragColor.rgb * saturateMatrix; |
||||||
|
gl_FragColor.rgb = mix(gl_FragColor.rgb, satColor, params.a); |
||||||
|
|
||||||
|
gl_FragColor.rgb = vec3(gl_FragColor.rgb + vec3(-0.096)); |
||||||
|
} |
||||||
@ -0,0 +1,92 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
vec3 rgb2hsv(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); |
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); |
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); |
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y); |
||||||
|
float e = 1.0e-10; |
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); |
||||||
|
} |
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c) { |
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); |
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
float GreyVal; |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorOri; |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
// step1 curve |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
|
||||||
|
//textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
vec3 tColor = vec3(redCurveValue, greenCurveValue, blueCurveValue); |
||||||
|
tColor = rgb2hsv(tColor); |
||||||
|
|
||||||
|
tColor.g = tColor.g * 1.2; |
||||||
|
|
||||||
|
float dStrength = 1.0; |
||||||
|
float dSatStrength = 0.3; |
||||||
|
|
||||||
|
float dGap = 0.0; |
||||||
|
|
||||||
|
if( tColor.r >= 0.0 && tColor.r < 0.417) |
||||||
|
{ |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r > 0.958 && tColor.r <= 1.0) |
||||||
|
{ |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.875 && tColor.r <= 0.958) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.875); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.0417 && tColor.r <= 0.125) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.125); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
|
||||||
|
tColor = hsv2rgb(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(tColor.r, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(tColor.g, 1.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(tColor.b, 1.0)).r; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).g; |
||||||
|
|
||||||
|
textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,73 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //process |
||||||
|
uniform sampler2D inputImageTexture3; //blowout |
||||||
|
uniform sampler2D inputImageTexture4; //contrast |
||||||
|
uniform sampler2D inputImageTexture5; //luma |
||||||
|
uniform sampler2D inputImageTexture6; //screen |
||||||
|
|
||||||
|
mat3 saturateMatrix = mat3( |
||||||
|
1.105150, -0.044850,-0.046000, |
||||||
|
-0.088050,1.061950,-0.089200, |
||||||
|
-0.017100,-0.017100,1.132900); |
||||||
|
|
||||||
|
vec3 luma = vec3(.3, .59, .11); |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
|
||||||
|
vec2 lookup; |
||||||
|
lookup.y = 0.5; |
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture2, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture2, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture2, lookup).b; |
||||||
|
|
||||||
|
texel = saturateMatrix * texel; |
||||||
|
|
||||||
|
vec2 tc = (2.0 * textureCoordinate) - 1.0; |
||||||
|
float d = dot(tc, tc); |
||||||
|
vec3 sampled; |
||||||
|
lookup.y = 0.5; |
||||||
|
lookup.x = texel.r; |
||||||
|
sampled.r = texture2D(inputImageTexture3, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
sampled.g = texture2D(inputImageTexture3, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
sampled.b = texture2D(inputImageTexture3, lookup).b; |
||||||
|
float value = smoothstep(0.0, 1.0, d); |
||||||
|
texel = mix(sampled, texel, value); |
||||||
|
|
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture4, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture4, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture4, lookup).b; |
||||||
|
|
||||||
|
|
||||||
|
lookup.x = dot(texel, luma); |
||||||
|
texel = mix(texture2D(inputImageTexture5, lookup).rgb, texel, .5); |
||||||
|
|
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture6, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture6, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture6, lookup).b; |
||||||
|
|
||||||
|
texel = mix(originColor.rgb, texel.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform lowp float brightness; |
||||||
|
|
||||||
|
void main() { |
||||||
|
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,148 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
uniform sampler2D inputImageTexture3; |
||||||
|
uniform sampler2D inputImageTexture4; |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
// gray |
||||||
|
float NCGray(vec4 color) |
||||||
|
{ |
||||||
|
float gray = 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b; |
||||||
|
return gray; |
||||||
|
} |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
vec4 NCTonemapping(vec4 color) |
||||||
|
{ |
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture2, vec2(color.r, 0.0)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture2, vec2(color.g, 0.0)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture2, vec2(color.b, 0.0)).b; |
||||||
|
mapped.a = color.a; |
||||||
|
|
||||||
|
return mapped; |
||||||
|
} |
||||||
|
|
||||||
|
// color control |
||||||
|
vec4 NCColorControl(vec4 color, float saturation, float brightness, float contrast) |
||||||
|
{ |
||||||
|
float gray = NCGray(color); |
||||||
|
|
||||||
|
color.rgb = vec3(saturation) * color.rgb + vec3(1.0-saturation) * vec3(gray); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = vec3(contrast) * (color.rgb - vec3(0.5)) + vec3(0.5); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = color.rgb + vec3(brightness); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// hue adjust |
||||||
|
vec4 NCHueAdjust(vec4 color, float hueAdjust) |
||||||
|
{ |
||||||
|
vec3 kRGBToYPrime = vec3(0.299, 0.587, 0.114); |
||||||
|
vec3 kRGBToI = vec3(0.595716, -0.274453, -0.321263); |
||||||
|
vec3 kRGBToQ = vec3(0.211456, -0.522591, 0.31135); |
||||||
|
|
||||||
|
vec3 kYIQToR = vec3(1.0, 0.9563, 0.6210); |
||||||
|
vec3 kYIQToG = vec3(1.0, -0.2721, -0.6474); |
||||||
|
vec3 kYIQToB = vec3(1.0, -1.1070, 1.7046); |
||||||
|
|
||||||
|
float yPrime = dot(color.rgb, kRGBToYPrime); |
||||||
|
float I = dot(color.rgb, kRGBToI); |
||||||
|
float Q = dot(color.rgb, kRGBToQ); |
||||||
|
|
||||||
|
float hue = atan(Q, I); |
||||||
|
float chroma = sqrt (I * I + Q * Q); |
||||||
|
|
||||||
|
hue -= hueAdjust; |
||||||
|
|
||||||
|
Q = chroma * sin (hue); |
||||||
|
I = chroma * cos (hue); |
||||||
|
|
||||||
|
color.r = dot(vec3(yPrime, I, Q), kYIQToR); |
||||||
|
color.g = dot(vec3(yPrime, I, Q), kYIQToG); |
||||||
|
color.b = dot(vec3(yPrime, I, Q), kYIQToB); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// colorMatrix |
||||||
|
vec4 NCColorMatrix(vec4 color, float red, float green, float blue, float alpha, vec4 bias) |
||||||
|
{ |
||||||
|
color = color * vec4(red, green, blue, alpha) + bias; |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// multiply blend |
||||||
|
vec4 NCMultiplyBlend(vec4 overlay, vec4 base) |
||||||
|
{ |
||||||
|
vec4 outputColor; |
||||||
|
|
||||||
|
float a = overlay.a + base.a * (1.0 - overlay.a); |
||||||
|
|
||||||
|
// // normal blend |
||||||
|
// outputColor.r = (base.r * base.a + overlay.r * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.g = (base.g * base.a + overlay.g * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.b = (base.b * base.a + overlay.b * overlay.a * (1.0 - base.a))/a; |
||||||
|
|
||||||
|
|
||||||
|
// multiply blend |
||||||
|
outputColor.rgb = ((1.0-base.a) * overlay.rgb * overlay.a + (1.0-overlay.a) * base.rgb * base.a + overlay.a * base.a * overlay.rgb * base.rgb) / a; |
||||||
|
|
||||||
|
|
||||||
|
outputColor.a = a; |
||||||
|
|
||||||
|
return outputColor; |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 color = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
color.a = 1.0; |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
color.r = texture2D(inputImageTexture2, vec2(color.r, 0.0)).r; |
||||||
|
color.g = texture2D(inputImageTexture2, vec2(color.g, 0.0)).g; |
||||||
|
color.b = texture2D(inputImageTexture2, vec2(color.b, 0.0)).b; |
||||||
|
|
||||||
|
// color control |
||||||
|
color = NCColorControl(color, 0.88, 0.03, 0.85); |
||||||
|
|
||||||
|
// hue adjust |
||||||
|
color = NCHueAdjust(color, -0.0444); |
||||||
|
|
||||||
|
// normal blend |
||||||
|
vec4 bg = vec4(0.5647, 0.1961, 0.0157, 0.14); |
||||||
|
color = NCMultiplyBlend(bg, color); |
||||||
|
|
||||||
|
// normal blend |
||||||
|
vec4 bg2 = texture2D(inputImageTexture3, textureCoordinate); |
||||||
|
bg2.a *= 0.9; |
||||||
|
color = NCMultiplyBlend(bg2, color); |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
color.r = texture2D(inputImageTexture4, vec2(color.r, 0.0)).r; |
||||||
|
color.g = texture2D(inputImageTexture4, vec2(color.g, 0.0)).g; |
||||||
|
color.b = texture2D(inputImageTexture4, vec2(color.b, 0.0)).b; |
||||||
|
|
||||||
|
color.rgb = mix(originColor.rgb, color.rgb, strength); |
||||||
|
gl_FragColor = color; |
||||||
|
} |
||||||
@ -0,0 +1,72 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D grey1Frame; |
||||||
|
uniform sampler2D grey2Frame; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
lowp float satura = 0.5; |
||||||
|
float GreyVal; |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorRes; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
vec4 grey1Color; |
||||||
|
vec4 grey2Color; |
||||||
|
|
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
textureColorRes = textureColor; |
||||||
|
|
||||||
|
grey1Color = texture2D(grey1Frame, vec2(xCoordinate, yCoordinate)); |
||||||
|
grey2Color = texture2D(grey2Frame, vec2(xCoordinate, yCoordinate)); |
||||||
|
|
||||||
|
// step 1. saturation |
||||||
|
lowp float luminance = dot(textureColor.rgb, luminanceWeighting); |
||||||
|
lowp vec3 greyScaleColor = vec3(luminance); |
||||||
|
|
||||||
|
textureColor = vec4(mix(greyScaleColor, textureColor.rgb, satura), textureColor.w); |
||||||
|
|
||||||
|
// step 2. level, blur curve, rgb curve |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0/2.0)).r; |
||||||
|
|
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0/2.0)).g; |
||||||
|
|
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0/2.0)).b; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0/2.0)).g; |
||||||
|
|
||||||
|
lowp vec4 base = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).r; |
||||||
|
lowp vec4 overlayer = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
//gl_FragColor = base * (1.0 - grey1Color.r) + overlayer * grey1Color.r; |
||||||
|
base = (base - overlayer) * (1.0 - grey1Color.r) + overlayer; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(base.r, 1.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(base.g, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(base.b, 1.0)).g; |
||||||
|
overlayer = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
|
||||||
|
textureColor = (base - overlayer) * (1.0 - grey2Color.r) + overlayer; |
||||||
|
//base * (grey2Color.r) + overlayer * (1.0 - grey2Color.r); |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform lowp float contrast; |
||||||
|
|
||||||
|
void main() { |
||||||
|
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,44 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
void main() { |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorOri; |
||||||
|
|
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
textureColorOri = textureColor; |
||||||
|
// step1 curve |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
// step2 level |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 0.0)).a; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 0.0)).a; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 0.0)).a; |
||||||
|
// step3 brightness/constrast adjust |
||||||
|
redCurveValue = redCurveValue * 1.25 - 0.12549; |
||||||
|
greenCurveValue = greenCurveValue * 1.25 - 0.12549; |
||||||
|
blueCurveValue = blueCurveValue * 1.25 - 0.12549; |
||||||
|
//redCurveValue = (((redCurveValue) > (1.0)) ? (1.0) : (((redCurveValue) < (0.0)) ? (0.0) : (redCurveValue))); |
||||||
|
//greenCurveValue = (((greenCurveValue) > (1.0)) ? (1.0) : (((greenCurveValue) < (0.0)) ? (0.0) : (greenCurveValue))); |
||||||
|
//blueCurveValue = (((blueCurveValue) > (1.0)) ? (1.0) : (((blueCurveValue) < (0.0)) ? (0.0) : (blueCurveValue))); |
||||||
|
// step4 normal blending with original |
||||||
|
textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
textureColor = (textureColorOri - textureColor) * 0.549 + textureColor; |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,56 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform vec2 singleStepOffset; |
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
const highp vec3 W = vec3(0.299,0.587,0.114); |
||||||
|
|
||||||
|
const mat3 rgb2yiqMatrix = mat3( |
||||||
|
0.299, 0.587, 0.114, |
||||||
|
0.596,-0.275,-0.321, |
||||||
|
0.212,-0.523, 0.311); |
||||||
|
|
||||||
|
const mat3 yiq2rgbMatrix = mat3( |
||||||
|
1.0, 0.956, 0.621, |
||||||
|
1.0,-0.272,-1.703, |
||||||
|
1.0,-1.106, 0.0); |
||||||
|
|
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 oralColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
vec3 maxValue = vec3(0.,0.,0.); |
||||||
|
|
||||||
|
for(int i = -2; i<=2; i++) |
||||||
|
{ |
||||||
|
for(int j = -2; j<=2; j++) |
||||||
|
{ |
||||||
|
vec4 tempColor = texture2D(inputImageTexture, textureCoordinate+singleStepOffset*vec2(i,j)); |
||||||
|
maxValue.r = max(maxValue.r,tempColor.r); |
||||||
|
maxValue.g = max(maxValue.g,tempColor.g); |
||||||
|
maxValue.b = max(maxValue.b,tempColor.b); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
vec3 textureColor = oralColor.rgb / maxValue; |
||||||
|
|
||||||
|
float gray = dot(textureColor, W); |
||||||
|
float k = 0.223529; |
||||||
|
float alpha = min(gray,k)/k; |
||||||
|
|
||||||
|
textureColor = textureColor * alpha + (1.-alpha)*oralColor.rgb; |
||||||
|
|
||||||
|
vec3 yiqColor = textureColor * rgb2yiqMatrix; |
||||||
|
|
||||||
|
yiqColor.r = max(0.0,min(1.0,pow(gray,strength))); |
||||||
|
|
||||||
|
textureColor = yiqColor * yiq2rgbMatrix; |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor, oralColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,102 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //earlyBirdCurves |
||||||
|
uniform sampler2D inputImageTexture3; //earlyBirdOverlay |
||||||
|
uniform sampler2D inputImageTexture4; //vig |
||||||
|
uniform sampler2D inputImageTexture5; //earlyBirdBlowout |
||||||
|
uniform sampler2D inputImageTexture6; //earlyBirdMap |
||||||
|
|
||||||
|
const mat3 saturate = mat3( |
||||||
|
1.210300, |
||||||
|
-0.089700, |
||||||
|
-0.091000, |
||||||
|
-0.176100, |
||||||
|
1.123900, |
||||||
|
-0.177400, |
||||||
|
-0.034200, |
||||||
|
-0.034200, |
||||||
|
1.265800); |
||||||
|
const vec3 rgbPrime = vec3(0.25098, 0.14640522, 0.0); |
||||||
|
const vec3 desaturate = vec3(.3, .59, .11); |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
|
||||||
|
vec2 lookup; |
||||||
|
lookup.y = 0.5; |
||||||
|
|
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture2, lookup).r; |
||||||
|
|
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture2, lookup).g; |
||||||
|
|
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture2, lookup).b; |
||||||
|
|
||||||
|
float desaturatedColor; |
||||||
|
vec3 result; |
||||||
|
desaturatedColor = dot(desaturate, texel); |
||||||
|
|
||||||
|
lookup.x = desaturatedColor; |
||||||
|
result.r = texture2D(inputImageTexture3, lookup).r; |
||||||
|
lookup.x = desaturatedColor; |
||||||
|
result.g = texture2D(inputImageTexture3, lookup).g; |
||||||
|
lookup.x = desaturatedColor; |
||||||
|
result.b = texture2D(inputImageTexture3, lookup).b; |
||||||
|
|
||||||
|
texel = saturate * mix(texel, result, .5); |
||||||
|
|
||||||
|
vec2 tc = (2.0 * textureCoordinate) - 1.0; |
||||||
|
float d = dot(tc, tc); |
||||||
|
|
||||||
|
vec3 sampled; |
||||||
|
lookup.y = .5; |
||||||
|
|
||||||
|
/* |
||||||
|
lookup.x = texel.r; |
||||||
|
sampled.r = texture2D(inputImageTexture4, lookup).r; |
||||||
|
|
||||||
|
lookup.x = texel.g; |
||||||
|
sampled.g = texture2D(inputImageTexture4, lookup).g; |
||||||
|
|
||||||
|
lookup.x = texel.b; |
||||||
|
sampled.b = texture2D(inputImageTexture4, lookup).b; |
||||||
|
|
||||||
|
float value = smoothstep(0.0, 1.25, pow(d, 1.35)/1.65); |
||||||
|
texel = mix(texel, sampled, value); |
||||||
|
*/ |
||||||
|
|
||||||
|
//--- |
||||||
|
lookup = vec2(d, texel.r); |
||||||
|
texel.r = texture2D(inputImageTexture4, lookup).r; |
||||||
|
lookup.y = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture4, lookup).g; |
||||||
|
lookup.y = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture4, lookup).b; |
||||||
|
float value = smoothstep(0.0, 1.25, pow(d, 1.35)/1.65); |
||||||
|
|
||||||
|
//--- |
||||||
|
lookup.x = texel.r; |
||||||
|
sampled.r = texture2D(inputImageTexture5, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
sampled.g = texture2D(inputImageTexture5, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
sampled.b = texture2D(inputImageTexture5, lookup).b; |
||||||
|
texel = mix(sampled, texel, value); |
||||||
|
|
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture6, lookup).r; |
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture6, lookup).g; |
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture6, lookup).b; |
||||||
|
|
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,89 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
vec3 RGBtoHSL(vec3 c) { |
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); |
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); |
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); |
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y); |
||||||
|
float e = 1.0e-10; |
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); |
||||||
|
} |
||||||
|
|
||||||
|
vec3 HSLtoRGB(vec3 c) { |
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); |
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
float GreyVal; |
||||||
|
highp vec4 textureColor; |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
|
||||||
|
// step1 curve |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
vec3 tColor = vec3(redCurveValue, greenCurveValue, blueCurveValue); |
||||||
|
tColor = RGBtoHSL(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
tColor.g = tColor.g * 1.5; |
||||||
|
|
||||||
|
float dStrength = 1.0; |
||||||
|
float dSatStrength = 0.15; |
||||||
|
float dHueStrength = 0.08; |
||||||
|
|
||||||
|
float dGap = 0.0; |
||||||
|
|
||||||
|
if( tColor.r >= 0.625 && tColor.r <= 0.708) |
||||||
|
{ |
||||||
|
tColor.r = tColor.r - (tColor.r * dHueStrength); |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.542 && tColor.r < 0.625) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.542); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.r = tColor.r + (tColor.r * dHueStrength * dStrength); |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
else if( tColor.r > 0.708 && tColor.r <= 0.792) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.792); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.r = tColor.r + (tColor.r * dHueStrength * dStrength); |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
|
||||||
|
tColor = HSLtoRGB(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(tColor.r, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(tColor.g, 1.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(tColor.b, 1.0)).r; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).g; |
||||||
|
|
||||||
|
textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,84 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
vec3 RGBtoHSL(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); |
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); |
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); |
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y); |
||||||
|
float e = 1.0e-10; |
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); |
||||||
|
} |
||||||
|
|
||||||
|
vec3 HSLtoRGB(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); |
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
float GreyVal; |
||||||
|
lowp vec4 textureColor; |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
|
||||||
|
vec3 tColor = vec3(textureColor.r, textureColor.g, textureColor.b); |
||||||
|
|
||||||
|
tColor = RGBtoHSL(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
|
||||||
|
tColor.g = tColor.g * 1.3; |
||||||
|
|
||||||
|
float dStrength = 1.0; |
||||||
|
float dSatStrength = 0.5; |
||||||
|
float dGap = 0.0; |
||||||
|
|
||||||
|
|
||||||
|
if( tColor.r >= 0.292 && tColor.r <= 0.375) |
||||||
|
{ |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.208 && tColor.r < 0.292) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.208); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
else if( tColor.r > 0.375 && tColor.r <= 0.458) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.458); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
tColor = HSLtoRGB(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(tColor.r, 0.0)).b; |
||||||
|
greenCurveValue = texture2D(curve, vec2(tColor.g, 0.0)).b; |
||||||
|
blueCurveValue = texture2D(curve, vec2(tColor.b, 0.0)).b; |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 0.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 0.0)).g; |
||||||
|
|
||||||
|
textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform highp float exposure; |
||||||
|
|
||||||
|
void main() { |
||||||
|
highp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
gl_FragColor = vec4(textureColor.rgb * pow(2.0, exposure), textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
|
||||||
|
void main() { |
||||||
|
gl_FragColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
} |
||||||
@ -0,0 +1,172 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
uniform float inputImageTextureHeight; |
||||||
|
uniform float inputImageTextureWidth; |
||||||
|
|
||||||
|
float texture2Size = 1024.0; |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
// gray |
||||||
|
float NCGray(vec4 color) |
||||||
|
{ |
||||||
|
float gray = 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b; |
||||||
|
return gray; |
||||||
|
} |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
vec4 NCTonemapping(vec4 color) |
||||||
|
{ |
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture2, vec2(color.r, 0.0)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture2, vec2(color.g, 0.0)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture2, vec2(color.b, 0.0)).b; |
||||||
|
mapped.a = color.a; |
||||||
|
return mapped; |
||||||
|
} |
||||||
|
|
||||||
|
// color control |
||||||
|
vec4 NCColorControl(vec4 color, float saturation, float brightness, float contrast) |
||||||
|
{ |
||||||
|
float gray = NCGray(color); |
||||||
|
|
||||||
|
color.rgb = vec3(saturation) * color.rgb + vec3(1.0-saturation) * vec3(gray); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = vec3(contrast) * (color.rgb - vec3(0.5)) + vec3(0.5); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = color.rgb + vec3(brightness); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// hue adjust |
||||||
|
vec4 NCHueAdjust(vec4 color, float hueAdjust) |
||||||
|
{ |
||||||
|
vec3 kRGBToYPrime = vec3(0.299, 0.587, 0.114); |
||||||
|
vec3 kRGBToI = vec3(0.595716, -0.274453, -0.321263); |
||||||
|
vec3 kRGBToQ = vec3(0.211456, -0.522591, 0.31135); |
||||||
|
|
||||||
|
vec3 kYIQToR = vec3(1.0, 0.9563, 0.6210); |
||||||
|
vec3 kYIQToG = vec3(1.0, -0.2721, -0.6474); |
||||||
|
vec3 kYIQToB = vec3(1.0, -1.1070, 1.7046); |
||||||
|
|
||||||
|
float yPrime = dot(color.rgb, kRGBToYPrime); |
||||||
|
float I = dot(color.rgb, kRGBToI); |
||||||
|
float Q = dot(color.rgb, kRGBToQ); |
||||||
|
|
||||||
|
float hue = atan(Q, I); |
||||||
|
float chroma = sqrt (I * I + Q * Q); |
||||||
|
|
||||||
|
hue -= hueAdjust; |
||||||
|
|
||||||
|
Q = chroma * sin (hue); |
||||||
|
I = chroma * cos (hue); |
||||||
|
|
||||||
|
color.r = dot(vec3(yPrime, I, Q), kYIQToR); |
||||||
|
color.g = dot(vec3(yPrime, I, Q), kYIQToG); |
||||||
|
color.b = dot(vec3(yPrime, I, Q), kYIQToB); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// colorMatrix |
||||||
|
vec4 NCColorMatrix(vec4 color, float red, float green, float blue, float alpha, vec4 bias) |
||||||
|
{ |
||||||
|
color = color * vec4(red, green, blue, alpha) + bias; |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// multiply blend |
||||||
|
vec4 NCMultiplyBlend(vec4 overlay, vec4 base) |
||||||
|
{ |
||||||
|
vec4 outputColor; |
||||||
|
|
||||||
|
float a = overlay.a + base.a * (1.0 - overlay.a); |
||||||
|
|
||||||
|
// // normal blend |
||||||
|
// outputColor.r = (base.r * base.a + overlay.r * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.g = (base.g * base.a + overlay.g * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.b = (base.b * base.a + overlay.b * overlay.a * (1.0 - base.a))/a; |
||||||
|
|
||||||
|
|
||||||
|
// multiply blend |
||||||
|
outputColor.rgb = ((1.0-base.a) * overlay.rgb * overlay.a + (1.0-overlay.a) * base.rgb * base.a + overlay.a * base.a * overlay.rgb * base.rgb) / a; |
||||||
|
|
||||||
|
|
||||||
|
outputColor.a = a; |
||||||
|
|
||||||
|
return outputColor; |
||||||
|
} |
||||||
|
|
||||||
|
// xy should be a integer position (e.g. pixel position on the screen) |
||||||
|
// similar to a texture lookup but is only ALU |
||||||
|
float PseudoRandom(vec2 co) |
||||||
|
{ |
||||||
|
// return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); |
||||||
|
mediump float a = 12.9898; |
||||||
|
mediump float b = 78.233; |
||||||
|
mediump float c = 43758.5453; |
||||||
|
mediump float dt= dot(co.xy ,vec2(a,b)); |
||||||
|
mediump float sn= mod(dt,3.14); |
||||||
|
return fract(sin(sn) * c); |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 color = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
color.a = 1.0; |
||||||
|
|
||||||
|
// color control |
||||||
|
// color = NCColorControl(color, 0.6, -0.06, 0.75); |
||||||
|
color = NCColorControl(color, 0.5, 0.1, 0.9); |
||||||
|
|
||||||
|
// rand |
||||||
|
float x = textureCoordinate.x*inputImageTextureWidth/texture2Size; |
||||||
|
float y = textureCoordinate.y*inputImageTextureHeight/texture2Size; |
||||||
|
|
||||||
|
vec4 rd = texture2D(inputImageTexture2, vec2( fract(x), fract(y))); |
||||||
|
// vec4 rd = texture2D(inputImageTexture2, textureCoordinate); |
||||||
|
// float rand_number1 = PseudoRandom(textureCoordinate.xy); |
||||||
|
// float rand_number2 = PseudoRandom(textureCoordinate.yx); |
||||||
|
// float rand_number3 = PseudoRandom(vec2(rand_number1, rand_number2)); |
||||||
|
// float rand_number4 = PseudoRandom(vec2(rand_number2, rand_number1)); |
||||||
|
// float rand_number5 = PseudoRandom(vec2(rand_number3, rand_number4)); |
||||||
|
|
||||||
|
// vec4 rd = vec4(rand_number1, rand_number3, rand_number5, 1.0); |
||||||
|
|
||||||
|
// if(rand_number4>0.2) |
||||||
|
// rd = vec4(1.0); |
||||||
|
|
||||||
|
// rand color control |
||||||
|
// rd = NCColorControl(rd, 0.65, 0.1, 0.7); |
||||||
|
rd = NCColorControl(rd, 1.0, 0.4, 1.2); |
||||||
|
|
||||||
|
// normal blend |
||||||
|
// rd.a *= 1.0; |
||||||
|
color = NCMultiplyBlend(rd, color); |
||||||
|
|
||||||
|
// color matrix |
||||||
|
// color = NCColorMatrix(color, 1.0, 1.0, 1.0, 1.0, vec4(-0.1, -0.1, -0.1, 0)); |
||||||
|
color = NCColorMatrix(color, 1.0, 1.0, 1.0, 1.0, vec4(-0.15, -0.15, -0.15, 0)); |
||||||
|
|
||||||
|
color.rgb = mix(originColor.rgb, color.rgb, strength); |
||||||
|
gl_FragColor = color; |
||||||
|
} |
||||||
@ -0,0 +1,141 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
uniform sampler2D mask; |
||||||
|
|
||||||
|
uniform float texelWidthOffset ; |
||||||
|
|
||||||
|
uniform float texelHeightOffset; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
vec4 level0c(vec4 color, sampler2D sampler) |
||||||
|
{ |
||||||
|
color.r = texture2D(sampler, vec2(color.r, 0.)).r; |
||||||
|
color.g = texture2D(sampler, vec2(color.g, 0.)).r; |
||||||
|
color.b = texture2D(sampler, vec2(color.b, 0.)).r; |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 level1c(vec4 color, sampler2D sampler) |
||||||
|
{ |
||||||
|
color.r = texture2D(sampler, vec2(color.r, 0.)).g; |
||||||
|
color.g = texture2D(sampler, vec2(color.g, 0.)).g; |
||||||
|
color.b = texture2D(sampler, vec2(color.b, 0.)).g; |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 level2c(vec4 color, sampler2D sampler) |
||||||
|
{ |
||||||
|
color.r = texture2D(sampler, vec2(color.r,0.)).b; |
||||||
|
color.g = texture2D(sampler, vec2(color.g,0.)).b; |
||||||
|
color.b = texture2D(sampler, vec2(color.b,0.)).b; |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec3 rgb2hsv(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); |
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); |
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); |
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y); |
||||||
|
float e = 1.0e-10; |
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); |
||||||
|
} |
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); |
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); |
||||||
|
} |
||||||
|
|
||||||
|
vec4 normal(vec4 c1, vec4 c2, float alpha) |
||||||
|
{ |
||||||
|
return (c2-c1) * alpha + c1; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 multiply(vec4 c1, vec4 c2) |
||||||
|
{ |
||||||
|
return c1 * c2 * 1.01; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 overlay(vec4 c1, vec4 c2) |
||||||
|
{ |
||||||
|
vec4 color = vec4(0.,0.,0.,1.); |
||||||
|
|
||||||
|
color.r = c1.r < 0.5 ? 2.0*c1.r*c2.r : 1.0 - 2.0*(1.0-c1.r)*(1.0-c2.r); |
||||||
|
color.g = c1.g < 0.5 ? 2.0*c1.g*c2.g : 1.0 - 2.0*(1.0-c1.g)*(1.0-c2.g); |
||||||
|
color.b = c1.b < 0.5 ? 2.0*c1.b*c2.b : 1.0 - 2.0*(1.0-c1.b)*(1.0-c2.b); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 screen(vec4 c1, vec4 c2) |
||||||
|
{ |
||||||
|
return vec4(1.) - ((vec4(1.) - c1) * (vec4(1.) - c2)); |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
// iOS ImageLiveFilter adjustment |
||||||
|
// begin |
||||||
|
|
||||||
|
vec4 textureColor; |
||||||
|
|
||||||
|
vec4 t0 = texture2D(mask, vec2(textureCoordinate.x, textureCoordinate.y)); |
||||||
|
|
||||||
|
// naver skin |
||||||
|
vec4 c2 = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 c5 = c2; |
||||||
|
|
||||||
|
// healthy |
||||||
|
vec3 hsv = rgb2hsv(c5.rgb); |
||||||
|
lowp float h = hsv.x; |
||||||
|
lowp float s = hsv.y; |
||||||
|
lowp float v = hsv.z; |
||||||
|
|
||||||
|
lowp float cF = 0.; |
||||||
|
// color strength |
||||||
|
lowp float cG = 0.; |
||||||
|
// color gap; |
||||||
|
lowp float sF = 0.06; |
||||||
|
// saturation strength; |
||||||
|
|
||||||
|
if(h >= 0.125 && h <= 0.208) |
||||||
|
{ |
||||||
|
// 45 to 75 |
||||||
|
s = s - (s * sF); |
||||||
|
} |
||||||
|
else if (h >= 0.208 && h < 0.292) |
||||||
|
{ |
||||||
|
// 75 to 105 |
||||||
|
cG = abs(h - 0.208); |
||||||
|
cF = (cG / 0.0833); |
||||||
|
s = s - (s * sF * cF); |
||||||
|
} |
||||||
|
else if (h > 0.042 && h <= 0.125) |
||||||
|
{ |
||||||
|
// 15 to 45 |
||||||
|
cG = abs(h - 0.125); |
||||||
|
cF = (cG / 0.0833); |
||||||
|
s = s - (s * sF * cF); |
||||||
|
} |
||||||
|
hsv.y = s; |
||||||
|
|
||||||
|
vec4 c6 = vec4(hsv2rgb(hsv),1.); |
||||||
|
|
||||||
|
c6 = normal(c6, screen (c6, c6), 0.275); // screen 70./255. |
||||||
|
c6 = normal(c6, overlay (c6, vec4(1., 0.61176, 0.25098, 1.)), 0.04); // overlay 10./255. |
||||||
|
|
||||||
|
c6 = normal(c6, multiply(c6, t0), 0.262); // multiply 67./255. |
||||||
|
|
||||||
|
c6 = level1c(level0c(c6,curve),curve); |
||||||
|
|
||||||
|
gl_FragColor = c6; |
||||||
|
// end |
||||||
|
} |
||||||
@ -0,0 +1,46 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //edgeBurn |
||||||
|
uniform sampler2D inputImageTexture3; //hefeMap |
||||||
|
uniform sampler2D inputImageTexture4; //hefeGradientMap |
||||||
|
uniform sampler2D inputImageTexture5; //hefeSoftLight |
||||||
|
uniform sampler2D inputImageTexture6; //hefeMetal |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
vec3 edge = texture2D(inputImageTexture2, textureCoordinate).rgb; |
||||||
|
texel = texel * edge; |
||||||
|
|
||||||
|
texel = vec3( |
||||||
|
texture2D(inputImageTexture3, vec2(texel.r, .16666)).r, |
||||||
|
texture2D(inputImageTexture3, vec2(texel.g, .5)).g, |
||||||
|
texture2D(inputImageTexture3, vec2(texel.b, .83333)).b); |
||||||
|
|
||||||
|
vec3 luma = vec3(.30, .59, .11); |
||||||
|
vec3 gradSample = texture2D(inputImageTexture4, vec2(dot(luma, texel), .5)).rgb; |
||||||
|
vec3 final = vec3( |
||||||
|
texture2D(inputImageTexture5, vec2(gradSample.r, texel.r)).r, |
||||||
|
texture2D(inputImageTexture5, vec2(gradSample.g, texel.g)).g, |
||||||
|
texture2D(inputImageTexture5, vec2(gradSample.b, texel.b)).b |
||||||
|
); |
||||||
|
|
||||||
|
vec3 metal = texture2D(inputImageTexture6, textureCoordinate).rgb; |
||||||
|
vec3 metaled = vec3( |
||||||
|
texture2D(inputImageTexture5, vec2(metal.r, texel.r)).r, |
||||||
|
texture2D(inputImageTexture5, vec2(metal.g, texel.g)).g, |
||||||
|
texture2D(inputImageTexture5, vec2(metal.b, texel.b)).b |
||||||
|
); |
||||||
|
|
||||||
|
metaled.rgb = mix(originColor.rgb, metaled.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = vec4(metaled, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //blowout; |
||||||
|
uniform sampler2D inputImageTexture3; //overlay; |
||||||
|
uniform sampler2D inputImageTexture4; //map |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
vec4 texel = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb; |
||||||
|
|
||||||
|
texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r; |
||||||
|
texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g; |
||||||
|
texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b; |
||||||
|
|
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b; |
||||||
|
mapped.a = 1.0; |
||||||
|
|
||||||
|
mapped.rgb = mix(originColor.rgb, mapped.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = mapped; |
||||||
|
} |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform mediump float hueAdjust; |
||||||
|
const highp vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0); |
||||||
|
const highp vec4 kRGBToI = vec4 (0.595716, -0.274453, -0.321263, 0.0); |
||||||
|
const highp vec4 kRGBToQ = vec4 (0.211456, -0.522591, 0.31135, 0.0); |
||||||
|
|
||||||
|
const highp vec4 kYIQToR = vec4 (1.0, 0.9563, 0.6210, 0.0); |
||||||
|
const highp vec4 kYIQToG = vec4 (1.0, -0.2721, -0.6474, 0.0); |
||||||
|
const highp vec4 kYIQToB = vec4 (1.0, -1.1070, 1.7046, 0.0); |
||||||
|
|
||||||
|
void main () { |
||||||
|
// Sample the input pixel |
||||||
|
highp vec4 color = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
// Convert to YIQ |
||||||
|
highp float YPrime = dot (color, kRGBToYPrime); |
||||||
|
highp float I = dot (color, kRGBToI); |
||||||
|
highp float Q = dot (color, kRGBToQ); |
||||||
|
|
||||||
|
// Calculate the hue and chroma |
||||||
|
highp float hue = atan (Q, I); |
||||||
|
highp float chroma = sqrt (I * I + Q * Q); |
||||||
|
|
||||||
|
// Make the user's adjustments |
||||||
|
hue += (-hueAdjust); //why negative rotation? |
||||||
|
|
||||||
|
// Convert back to YIQ |
||||||
|
Q = chroma * sin (hue); |
||||||
|
I = chroma * cos (hue); |
||||||
|
|
||||||
|
// Convert back to RGB |
||||||
|
highp vec4 yIQ = vec4 (YPrime, I, Q, 0.0); |
||||||
|
color.r = dot (yIQ, kYIQToR); |
||||||
|
color.g = dot (yIQ, kYIQToG); |
||||||
|
color.b = dot (yIQ, kYIQToB); |
||||||
|
|
||||||
|
// Save the result |
||||||
|
gl_FragColor = color; |
||||||
|
} |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
texel = vec3(dot(vec3(0.3, 0.6, 0.1), texel)); |
||||||
|
texel = vec3(texture2D(inputImageTexture2, vec2(texel.r, .16666)).r); |
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
vec2 lookup; |
||||||
|
lookup.y = .5; |
||||||
|
|
||||||
|
lookup.x = texel.r; |
||||||
|
texel.r = texture2D(inputImageTexture2, lookup).r; |
||||||
|
|
||||||
|
lookup.x = texel.g; |
||||||
|
texel.g = texture2D(inputImageTexture2, lookup).g; |
||||||
|
|
||||||
|
lookup.x = texel.b; |
||||||
|
texel.b = texture2D(inputImageTexture2, lookup).b; |
||||||
|
|
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,163 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
vec3 rgb2hsv(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); |
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); |
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); |
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y); |
||||||
|
float e = 1.0e-10; |
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); |
||||||
|
} |
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c) |
||||||
|
{ |
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); |
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
float GreyVal; |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorOri; |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
mediump vec4 base = textureColor; |
||||||
|
mediump vec4 overlay = vec4(0.792, 0.58, 0.372, 1.0); |
||||||
|
|
||||||
|
// step1 overlay blending |
||||||
|
mediump float ra; |
||||||
|
if (base.r < 0.5) |
||||||
|
{ |
||||||
|
ra = overlay.r * base.r * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ra = 1.0 - ((1.0 - base.r) * (1.0 - overlay.r) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ga; |
||||||
|
if (base.g < 0.5) |
||||||
|
{ |
||||||
|
ga = overlay.g * base.g * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ga = 1.0 - ((1.0 - base.g) * (1.0 - overlay.g) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ba; |
||||||
|
if (base.b < 0.5) |
||||||
|
{ |
||||||
|
ba = overlay.b * base.b * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ba = 1.0 - ((1.0 - base.b) * (1.0 - overlay.b) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
textureColor = vec4(ra, ga, ba, 1.0); |
||||||
|
textureColor = (textureColor - base) * 0.3 + base; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).g; |
||||||
|
|
||||||
|
|
||||||
|
vec3 tColor = vec3(redCurveValue, greenCurveValue, blueCurveValue); |
||||||
|
tColor = rgb2hsv(tColor); |
||||||
|
|
||||||
|
tColor.g = tColor.g * 0.6; |
||||||
|
|
||||||
|
float dStrength = 1.0; |
||||||
|
float dSatStrength = 0.2; |
||||||
|
|
||||||
|
float dGap = 0.0; |
||||||
|
|
||||||
|
if( tColor.r >= 0.0 && tColor.r < 0.417) |
||||||
|
{ |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r > 0.958 && tColor.r <= 1.0) |
||||||
|
{ |
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.875 && tColor.r <= 0.958) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.875); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
else if( tColor.r >= 0.0417 && tColor.r <= 0.125) |
||||||
|
{ |
||||||
|
dGap = abs(tColor.r - 0.125); |
||||||
|
dStrength = (dGap / 0.0833); |
||||||
|
|
||||||
|
tColor.g = tColor.g + (tColor.g * dSatStrength * dStrength); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
tColor = hsv2rgb(tColor); |
||||||
|
tColor = clamp(tColor, 0.0, 1.0); |
||||||
|
|
||||||
|
redCurveValue = texture2D(curve, vec2(tColor.r, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(tColor.g, 1.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(tColor.b, 1.0)).r; |
||||||
|
|
||||||
|
base = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
overlay = vec4(0.792, 0.494, 0.372, 1.0); |
||||||
|
|
||||||
|
// step5 overlay blending |
||||||
|
if (base.r < 0.5) |
||||||
|
{ |
||||||
|
ra = overlay.r * base.r * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ra = 1.0 - ((1.0 - base.r) * (1.0 - overlay.r) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
if (base.g < 0.5) |
||||||
|
{ |
||||||
|
ga = overlay.g * base.g * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ga = 1.0 - ((1.0 - base.g) * (1.0 - overlay.g) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
if (base.b < 0.5) |
||||||
|
{ |
||||||
|
ba = overlay.b * base.b * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ba = 1.0 - ((1.0 - base.b) * (1.0 - overlay.b) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
textureColor = vec4(ra, ga, ba, 1.0); |
||||||
|
textureColor = (textureColor - base) * 0.15 + base; |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
uniform sampler2D inputImageTexture3; |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = vec4(0.2,0.6,0.9,1.0); |
||||||
|
vec3 texel; |
||||||
|
vec2 tc = (2.0 * textureCoordinate) - 1.0; |
||||||
|
float d = dot(tc, tc); |
||||||
|
vec2 lookup = vec2(d, originColor.r); |
||||||
|
texel.r = texture2D(inputImageTexture3, lookup).r; |
||||||
|
lookup.y = originColor.g; |
||||||
|
texel.g = texture2D(inputImageTexture3, lookup).g; |
||||||
|
lookup.y = originColor.b; |
||||||
|
texel.b = texture2D(inputImageTexture3, lookup).b; |
||||||
|
|
||||||
|
texel.rgb = mix(originColor.rgb, texel.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = vec4(texel,1.0); |
||||||
|
} |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; // lookup texture\n" + |
||||||
|
|
||||||
|
void main() { |
||||||
|
|
||||||
|
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + |
||||||
|
|
||||||
|
mediump float blueColor = textureColor.b * 63.0; |
||||||
|
|
||||||
|
mediump vec2 quad1; |
||||||
|
quad1.y = floor(floor(blueColor) / 8.0); |
||||||
|
quad1.x = floor(blueColor) - (quad1.y * 8.0); |
||||||
|
|
||||||
|
mediump vec2 quad2;\n" + |
||||||
|
quad2.y = floor(ceil(blueColor) / 8.0);\n" + |
||||||
|
quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n" + |
||||||
|
|
||||||
|
highp vec2 texPos1; |
||||||
|
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); |
||||||
|
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); |
||||||
|
|
||||||
|
highp vec2 texPos2;\n" + |
||||||
|
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); |
||||||
|
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); |
||||||
|
|
||||||
|
lowp vec4 newColor1 = texture2D(inputImageTexture2, texPos1); |
||||||
|
lowp vec4 newColor2 = texture2D(inputImageTexture2, texPos2); |
||||||
|
|
||||||
|
lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); |
||||||
|
gl_FragColor = vec4(newColor.rgb, textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,19 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
texel = vec3( |
||||||
|
texture2D(inputImageTexture2, vec2(texel.r, .16666)).r, |
||||||
|
texture2D(inputImageTexture2, vec2(texel.g, .5)).g, |
||||||
|
texture2D(inputImageTexture2, vec2(texel.b, .83333)).b); |
||||||
|
|
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec3 texel = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
texel = vec3( |
||||||
|
texture2D(inputImageTexture2, vec2(texel.r, .16666)).r, |
||||||
|
texture2D(inputImageTexture2, vec2(texel.g, .5)).g, |
||||||
|
texture2D(inputImageTexture2, vec2(texel.b, .83333)).b); |
||||||
|
gl_FragColor = vec4(texel, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,108 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
uniform sampler2D curve2; |
||||||
|
uniform highp float texelWidthOffset; |
||||||
|
uniform highp float texelHeightOffset; |
||||||
|
uniform highp float blurSize; |
||||||
|
|
||||||
|
vec4 OverlayBlendingVec4(vec4 down, vec4 up, float fAlpha) |
||||||
|
{ |
||||||
|
if ( down.r < 0.5 ) |
||||||
|
{ |
||||||
|
up.r = up.r * down.r * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
up.r = 1.0 - ( ( 1.0 - down.r) * ( 1.0 - up.r ) * 2.0 ); |
||||||
|
} |
||||||
|
if ( down.g < 0.5 ) |
||||||
|
{ |
||||||
|
up.g = up.g * down.g * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
up.g = 1.0 - ( ( 1.0 - down.g) * ( 1.0 - up.g ) * 2.0 ); |
||||||
|
} |
||||||
|
|
||||||
|
if ( down.b < 0.5 ) |
||||||
|
{ |
||||||
|
up.b = up.b * down.b * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
up.b = 1.0 - ( ( 1.0 - down.b) * ( 1.0 - up.b ) * 2.0 ); |
||||||
|
} |
||||||
|
|
||||||
|
down = ( up - down ) * fAlpha + down; |
||||||
|
|
||||||
|
return down; |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
vec4 textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
highp vec2 firstOffset = vec2(1.3846153846 * texelWidthOffset, 1.3846153846 * texelHeightOffset) * blurSize; |
||||||
|
highp vec2 secondOffset = vec2(3.2307692308 * texelWidthOffset, 3.2307692308 * texelHeightOffset) * blurSize; |
||||||
|
|
||||||
|
highp vec2 centerTextureCoordinate = vec2(xCoordinate, yCoordinate); |
||||||
|
highp vec2 oneStepLeftTextureCoordinate = vec2(xCoordinate, yCoordinate) - firstOffset; |
||||||
|
highp vec2 twoStepsLeftTextureCoordinate = vec2(xCoordinate, yCoordinate) - secondOffset; |
||||||
|
highp vec2 oneStepRightTextureCoordinate = vec2(xCoordinate, yCoordinate) + firstOffset; |
||||||
|
highp vec2 twoStepsRightTextureCoordinate = vec2(xCoordinate, yCoordinate) + secondOffset; |
||||||
|
|
||||||
|
lowp vec4 fragmentColor = texture2D(inputImageTexture, vec2(centerTextureCoordinate.x, centerTextureCoordinate.y)) * 0.2270270270; |
||||||
|
fragmentColor += texture2D(inputImageTexture, vec2(oneStepLeftTextureCoordinate.x, oneStepLeftTextureCoordinate.y)) * 0.3162162162; |
||||||
|
fragmentColor += texture2D(inputImageTexture, vec2(oneStepRightTextureCoordinate.x, oneStepRightTextureCoordinate.y)) * 0.3162162162; |
||||||
|
fragmentColor += texture2D(inputImageTexture, vec2(twoStepsLeftTextureCoordinate.x, twoStepsLeftTextureCoordinate.y)) * 0.0702702703; |
||||||
|
fragmentColor += texture2D(inputImageTexture, vec2(twoStepsRightTextureCoordinate.x, twoStepsRightTextureCoordinate.y)) * 0.0702702703; |
||||||
|
|
||||||
|
lowp vec4 blurColor = fragmentColor; |
||||||
|
|
||||||
|
// step1 ScreenBlending |
||||||
|
blurColor = 1.0 - ((1.0 - textureColor) * (1.0 - blurColor)); |
||||||
|
blurColor = clamp(blurColor, 0.0, 1.0); |
||||||
|
textureColor = (blurColor - textureColor) * 0.7 + textureColor; |
||||||
|
textureColor = clamp(textureColor, 0.0, 1.0); |
||||||
|
|
||||||
|
// step2 OverlayBlending |
||||||
|
textureColor = OverlayBlendingVec4(textureColor, vec4(0.0, 0.0, 0.0, 1.0), 0.3); |
||||||
|
textureColor = clamp(textureColor, vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0)); |
||||||
|
|
||||||
|
// step3 curve |
||||||
|
highp float redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
highp float greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
highp float blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
// step4 curve |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).r; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).r; |
||||||
|
|
||||||
|
// step5 level |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).g; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).g; |
||||||
|
|
||||||
|
// step6 curve |
||||||
|
redCurveValue = texture2D(curve2, vec2(redCurveValue, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve2, vec2(greenCurveValue, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve2, vec2(blueCurveValue, 1.0)).b; |
||||||
|
|
||||||
|
// step7 curve |
||||||
|
redCurveValue = texture2D(curve, vec2(redCurveValue, 1.0)).b; |
||||||
|
greenCurveValue = texture2D(curve, vec2(greenCurveValue, 1.0)).b; |
||||||
|
|
||||||
|
blueCurveValue = texture2D(curve, vec2(blueCurveValue, 1.0)).b; |
||||||
|
|
||||||
|
lowp vec4 BCSColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
gl_FragColor = vec4(BCSColor.r,BCSColor.g,BCSColor.b,1.0); |
||||||
|
} |
||||||
@ -0,0 +1,137 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
// gray |
||||||
|
float NCGray(vec4 color) |
||||||
|
{ |
||||||
|
float gray = 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b; |
||||||
|
return gray; |
||||||
|
} |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
vec4 NCTonemapping(vec4 color) |
||||||
|
{ |
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture2, vec2(color.r, 0.0)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture2, vec2(color.g, 0.0)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture2, vec2(color.b, 0.0)).b; |
||||||
|
mapped.a = color.a; |
||||||
|
return mapped; |
||||||
|
} |
||||||
|
|
||||||
|
// color control |
||||||
|
vec4 NCColorControl(vec4 color, float saturation, float brightness, float contrast) |
||||||
|
{ |
||||||
|
float gray = NCGray(color); |
||||||
|
|
||||||
|
color.rgb = vec3(saturation) * color.rgb + vec3(1.0-saturation) * vec3(gray); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = vec3(contrast) * (color.rgb - vec3(0.5)) + vec3(0.5); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
color.rgb = color.rgb + vec3(brightness); |
||||||
|
color.r = clamp(color.r, 0.0, 1.0); |
||||||
|
color.g = clamp(color.g, 0.0, 1.0); |
||||||
|
color.b = clamp(color.b, 0.0, 1.0); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// hue adjust |
||||||
|
vec4 NCHueAdjust(vec4 color, float hueAdjust) |
||||||
|
{ |
||||||
|
vec3 kRGBToYPrime = vec3(0.299, 0.587, 0.114); |
||||||
|
vec3 kRGBToI = vec3(0.595716, -0.274453, -0.321263); |
||||||
|
vec3 kRGBToQ = vec3(0.211456, -0.522591, 0.31135); |
||||||
|
|
||||||
|
vec3 kYIQToR = vec3(1.0, 0.9563, 0.6210); |
||||||
|
vec3 kYIQToG = vec3(1.0, -0.2721, -0.6474); |
||||||
|
vec3 kYIQToB = vec3(1.0, -1.1070, 1.7046); |
||||||
|
|
||||||
|
float yPrime = dot(color.rgb, kRGBToYPrime); |
||||||
|
float I = dot(color.rgb, kRGBToI); |
||||||
|
float Q = dot(color.rgb, kRGBToQ); |
||||||
|
|
||||||
|
float hue = atan(Q, I); |
||||||
|
float chroma = sqrt (I * I + Q * Q); |
||||||
|
|
||||||
|
hue -= hueAdjust; |
||||||
|
|
||||||
|
Q = chroma * sin (hue); |
||||||
|
I = chroma * cos (hue); |
||||||
|
|
||||||
|
color.r = dot(vec3(yPrime, I, Q), kYIQToR); |
||||||
|
color.g = dot(vec3(yPrime, I, Q), kYIQToG); |
||||||
|
color.b = dot(vec3(yPrime, I, Q), kYIQToB); |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// colorMatrix |
||||||
|
vec4 NCColorMatrix(vec4 color, float red, float green, float blue, float alpha, vec4 bias) |
||||||
|
{ |
||||||
|
color = color * vec4(red, green, blue, alpha) + bias; |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
// multiply blend |
||||||
|
vec4 NCMultiplyBlend(vec4 overlay, vec4 base) |
||||||
|
{ |
||||||
|
vec4 outputColor; |
||||||
|
|
||||||
|
float a = overlay.a + base.a * (1.0 - overlay.a); |
||||||
|
|
||||||
|
// // normal blend |
||||||
|
// outputColor.r = (base.r * base.a + overlay.r * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.g = (base.g * base.a + overlay.g * overlay.a * (1.0 - base.a))/a; |
||||||
|
// outputColor.b = (base.b * base.a + overlay.b * overlay.a * (1.0 - base.a))/a; |
||||||
|
|
||||||
|
|
||||||
|
// multiply blend |
||||||
|
outputColor.rgb = ((1.0-base.a) * overlay.rgb * overlay.a + (1.0-overlay.a) * base.rgb * base.a + overlay.a * base.a * overlay.rgb * base.rgb) / a; |
||||||
|
|
||||||
|
|
||||||
|
outputColor.a = a; |
||||||
|
|
||||||
|
return outputColor; |
||||||
|
} |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 color = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
color.a = 1.0; |
||||||
|
|
||||||
|
// tone mapping |
||||||
|
color.r = texture2D(inputImageTexture2, vec2(color.r, 0.0)).r; |
||||||
|
color.g = texture2D(inputImageTexture2, vec2(color.g, 0.0)).g; |
||||||
|
color.b = texture2D(inputImageTexture2, vec2(color.b, 0.0)).b; |
||||||
|
|
||||||
|
// color control |
||||||
|
color = NCColorControl(color, 1.0, 0.08, 1.0); |
||||||
|
|
||||||
|
// hue adjust |
||||||
|
color = NCHueAdjust(color, 0.0556); |
||||||
|
|
||||||
|
// color matrix |
||||||
|
color = NCColorMatrix(color, 1.0, 1.0, 1.0, 1.0, vec4(0.02, 0.02, 0.06, 0)); |
||||||
|
|
||||||
|
color.rgb = mix(originColor.rgb, color.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = color; |
||||||
|
} |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //blowout; |
||||||
|
uniform sampler2D inputImageTexture3; //overlay; |
||||||
|
uniform sampler2D inputImageTexture4; //map |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 texel = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb; |
||||||
|
|
||||||
|
texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r; |
||||||
|
texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g; |
||||||
|
texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b; |
||||||
|
|
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b; |
||||||
|
mapped.a = 1.0; |
||||||
|
|
||||||
|
mapped.rgb = mix(originColor.rgb, mapped.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = mapped; |
||||||
|
} |
||||||
@ -0,0 +1,50 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorRes; |
||||||
|
lowp vec4 textureColorOri; |
||||||
|
vec4 grey1Color; |
||||||
|
vec4 layerColor; |
||||||
|
mediump float satVal = 115.0 / 100.0; |
||||||
|
|
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
textureColorRes = textureColor; |
||||||
|
textureColorOri = textureColor; |
||||||
|
|
||||||
|
// step1. screen blending |
||||||
|
textureColor = 1.0 - ((1.0 - textureColorOri) * (1.0 - textureColorOri)); |
||||||
|
textureColor = (textureColor - textureColorOri) + textureColorOri; |
||||||
|
|
||||||
|
// step2. curve |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
// step3. saturation |
||||||
|
highp float G = (redCurveValue + greenCurveValue + blueCurveValue); |
||||||
|
G = G / 3.0; |
||||||
|
|
||||||
|
redCurveValue = ((1.0 - satVal) * G + satVal * redCurveValue); |
||||||
|
greenCurveValue = ((1.0 - satVal) * G + satVal * greenCurveValue); |
||||||
|
blueCurveValue = ((1.0 - satVal) * G + satVal * blueCurveValue); |
||||||
|
|
||||||
|
textureColor = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
uniform float texelWidthOffset; |
||||||
|
uniform float texelHeightOffset; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
vec4 gaussianBlur(sampler2D sampler) { |
||||||
|
lowp float strength = 1.; |
||||||
|
vec4 color = vec4(0.); |
||||||
|
vec2 step = vec2(0.); |
||||||
|
|
||||||
|
color += texture2D(sampler,textureCoordinate)* 0.25449 ; |
||||||
|
|
||||||
|
step.x = 1.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 1.37754 * texelHeightOffset * strength; |
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.24797; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.24797; |
||||||
|
|
||||||
|
step.x = 3.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 3.37754 * texelHeightOffset * strength; |
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.09122; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.09122; |
||||||
|
|
||||||
|
step.x = 5.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 5.37754 * texelHeightOffset * strength; |
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.03356; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.03356; |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 overlay(vec4 c1, vec4 c2){ |
||||||
|
vec4 r1 = vec4(0.,0.,0.,1.); |
||||||
|
|
||||||
|
r1.r = c1.r < 0.5 ? 2.0*c1.r*c2.r : 1.0 - 2.0*(1.0-c1.r)*(1.0-c2.r); |
||||||
|
r1.g = c1.g < 0.5 ? 2.0*c1.g*c2.g : 1.0 - 2.0*(1.0-c1.g)*(1.0-c2.g); |
||||||
|
r1.b = c1.b < 0.5 ? 2.0*c1.b*c2.b : 1.0 - 2.0*(1.0-c1.b)*(1.0-c2.b); |
||||||
|
|
||||||
|
return r1; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 level0c(vec4 color, sampler2D sampler) { |
||||||
|
color.r = texture2D(sampler, vec2(color.r, 0.)).r; |
||||||
|
color.g = texture2D(sampler, vec2(color.g, 0.)).r; |
||||||
|
color.b = texture2D(sampler, vec2(color.b, 0.)).r; |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 normal(vec4 c1, vec4 c2, float alpha) { |
||||||
|
return (c2-c1) * alpha + c1; |
||||||
|
} |
||||||
|
|
||||||
|
vec4 screen(vec4 c1, vec4 c2) { |
||||||
|
vec4 r1 = vec4(1.) - ((vec4(1.) - c1) * (vec4(1.) - c2)); |
||||||
|
return r1; |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
// naver skin |
||||||
|
lowp vec4 c0 = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
lowp vec4 c1 = gaussianBlur(inputImageTexture); |
||||||
|
lowp vec4 c2 = overlay(c0, level0c(c1, curve)); |
||||||
|
lowp vec4 c3 = normal(c0,c2,0.15); |
||||||
|
|
||||||
|
gl_FragColor = c3; |
||||||
|
} |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
uniform lowp float saturation; |
||||||
|
|
||||||
|
// Values from \"Graphics Shaders: Theory and Practice\" by Bailey and Cunningham |
||||||
|
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); |
||||||
|
|
||||||
|
void main() { |
||||||
|
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
lowp float luminance = dot(textureColor.rgb, luminanceWeighting); |
||||||
|
lowp vec3 greyScaleColor = vec3(luminance); |
||||||
|
|
||||||
|
gl_FragColor = vec4(mix(greyScaleColor, textureColor.rgb, saturation), textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
varying highp vec2 leftTextureCoordinate; |
||||||
|
varying highp vec2 rightTextureCoordinate; |
||||||
|
varying highp vec2 topTextureCoordinate; |
||||||
|
varying highp vec2 bottomTextureCoordinate; |
||||||
|
|
||||||
|
varying highp float centerMultiplier; |
||||||
|
varying highp float edgeMultiplier; |
||||||
|
|
||||||
|
uniform sampler2D inputImageTexture; |
||||||
|
|
||||||
|
void main() { |
||||||
|
mediump vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb; |
||||||
|
mediump vec3 leftTextureColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb; |
||||||
|
mediump vec3 rightTextureColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb; |
||||||
|
mediump vec3 topTextureColor = texture2D(inputImageTexture, topTextureCoordinate).rgb; |
||||||
|
mediump vec3 bottomTextureColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb; |
||||||
|
|
||||||
|
gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w); |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; //blowout; |
||||||
|
uniform sampler2D inputImageTexture3; //overlay; |
||||||
|
uniform sampler2D inputImageTexture4; //map |
||||||
|
|
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec4 texel = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
vec3 bbTexel = texture2D(inputImageTexture2, textureCoordinate).rgb; |
||||||
|
|
||||||
|
texel.r = texture2D(inputImageTexture3, vec2(bbTexel.r, texel.r)).r; |
||||||
|
texel.g = texture2D(inputImageTexture3, vec2(bbTexel.g, texel.g)).g; |
||||||
|
texel.b = texture2D(inputImageTexture3, vec2(bbTexel.b, texel.b)).b; |
||||||
|
|
||||||
|
vec4 mapped; |
||||||
|
mapped.r = texture2D(inputImageTexture4, vec2(texel.r, .16666)).r; |
||||||
|
mapped.g = texture2D(inputImageTexture4, vec2(texel.g, .5)).g; |
||||||
|
mapped.b = texture2D(inputImageTexture4, vec2(texel.b, .83333)).b; |
||||||
|
mapped.a = 1.0; |
||||||
|
|
||||||
|
mapped.rgb = mix(originColor.rgb, mapped.rgb, strength); |
||||||
|
gl_FragColor = mapped; |
||||||
|
} |
||||||
@ -0,0 +1,49 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision mediump float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform vec2 singleStepOffset; |
||||||
|
uniform float strength; |
||||||
|
|
||||||
|
const highp vec3 W = vec3(0.299,0.587,0.114); |
||||||
|
|
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
float threshold = 0.0; |
||||||
|
//pic1 |
||||||
|
vec4 oralColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
//pic2 |
||||||
|
vec3 maxValue = vec3(0.,0.,0.); |
||||||
|
|
||||||
|
for(int i = -2; i<=2; i++) |
||||||
|
{ |
||||||
|
for(int j = -2; j<=2; j++) |
||||||
|
{ |
||||||
|
vec4 tempColor = texture2D(inputImageTexture, textureCoordinate+singleStepOffset*vec2(i,j)); |
||||||
|
maxValue.r = max(maxValue.r,tempColor.r); |
||||||
|
maxValue.g = max(maxValue.g,tempColor.g); |
||||||
|
maxValue.b = max(maxValue.b,tempColor.b); |
||||||
|
threshold += dot(tempColor.rgb, W); |
||||||
|
} |
||||||
|
} |
||||||
|
//pic3 |
||||||
|
float gray1 = dot(oralColor.rgb, W); |
||||||
|
|
||||||
|
//pic4 |
||||||
|
float gray2 = dot(maxValue, W); |
||||||
|
|
||||||
|
//pic5 |
||||||
|
float contour = gray1 / gray2; |
||||||
|
|
||||||
|
threshold = threshold / 25.; |
||||||
|
float alpha = max(1.0,gray1>threshold?1.0:(gray1/threshold)); |
||||||
|
|
||||||
|
float result = contour * alpha + (1.0-alpha)*gray1; |
||||||
|
|
||||||
|
gl_FragColor = vec4(vec3(result,result,result), oralColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,98 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
uniform float texelWidthOffset; |
||||||
|
uniform float texelHeightOffset; |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
|
||||||
|
const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721); |
||||||
|
|
||||||
|
vec4 gaussianBlur(sampler2D sampler) { |
||||||
|
lowp float strength = 1.; |
||||||
|
vec4 color = vec4(0.); |
||||||
|
vec2 step = vec2(0.); |
||||||
|
|
||||||
|
color += texture2D(sampler,textureCoordinate)* 0.25449 ; |
||||||
|
|
||||||
|
step.x = 1.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 1.37754 * texelHeightOffset * strength; |
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.24797; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.24797; |
||||||
|
|
||||||
|
step.x = 3.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 3.37754 * texelHeightOffset * strength; |
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.09122; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.09122; |
||||||
|
|
||||||
|
step.x = 5.37754 * texelWidthOffset * strength; |
||||||
|
step.y = 5.37754 * texelHeightOffset * strength; |
||||||
|
|
||||||
|
color += texture2D(sampler,textureCoordinate+step) * 0.03356; |
||||||
|
color += texture2D(sampler,textureCoordinate-step) * 0.03356; |
||||||
|
|
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
vec4 blurColor; |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp float strength = -1.0 / 510.0; |
||||||
|
|
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
lowp float satura = 0.7; |
||||||
|
// naver skin |
||||||
|
textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
blurColor = gaussianBlur(inputImageTexture); |
||||||
|
|
||||||
|
//saturation |
||||||
|
lowp float luminance = dot(blurColor.rgb, luminanceWeighting); |
||||||
|
lowp vec3 greyScaleColor = vec3(luminance); |
||||||
|
|
||||||
|
blurColor = vec4(mix(greyScaleColor, blurColor.rgb, satura), blurColor.w); |
||||||
|
|
||||||
|
lowp float redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
lowp float greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).r; |
||||||
|
lowp float blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).r; |
||||||
|
|
||||||
|
redCurveValue = min(1.0, redCurveValue + strength); |
||||||
|
greenCurveValue = min(1.0, greenCurveValue + strength); |
||||||
|
blueCurveValue = min(1.0, blueCurveValue + strength); |
||||||
|
|
||||||
|
mediump vec4 overlay = blurColor; |
||||||
|
|
||||||
|
mediump vec4 base = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
//gl_FragColor = overlay; |
||||||
|
|
||||||
|
// step4 overlay blending |
||||||
|
mediump float ra; |
||||||
|
if (base.r < 0.5) { |
||||||
|
ra = overlay.r * base.r * 2.0; |
||||||
|
} else { |
||||||
|
ra = 1.0 - ((1.0 - base.r) * (1.0 - overlay.r) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ga; |
||||||
|
if (base.g < 0.5) { |
||||||
|
ga = overlay.g * base.g * 2.0; |
||||||
|
} else { |
||||||
|
ga = 1.0 - ((1.0 - base.g) * (1.0 - overlay.g) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ba; |
||||||
|
if (base.b < 0.5) { |
||||||
|
ba = overlay.b * base.b * 2.0; |
||||||
|
} else { |
||||||
|
ba = 1.0 - ((1.0 - base.b) * (1.0 - overlay.b) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
textureColor = vec4(ra, ga, ba, 1.0); |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
varying mediump vec2 textureCoordinate; |
||||||
|
varying mediump vec2 textureCoordinate2; // TODO: This is not used |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D inputImageTexture2; // lookup texture |
||||||
|
uniform mediump float strength; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
mediump vec4 originColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); |
||||||
|
|
||||||
|
mediump float blueColor = textureColor.b * 63.0; |
||||||
|
|
||||||
|
mediump vec2 quad1; |
||||||
|
quad1.y = floor(floor(blueColor) / 8.0); |
||||||
|
quad1.x = floor(blueColor) - (quad1.y * 8.0); |
||||||
|
|
||||||
|
mediump vec2 quad2; |
||||||
|
quad2.y = floor(ceil(blueColor) / 8.0); |
||||||
|
quad2.x = ceil(blueColor) - (quad2.y * 8.0); |
||||||
|
|
||||||
|
mediump vec2 texPos1; |
||||||
|
texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); |
||||||
|
texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); |
||||||
|
|
||||||
|
mediump vec2 texPos2; |
||||||
|
texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); |
||||||
|
texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); |
||||||
|
|
||||||
|
mediump vec4 newColor1 = texture2D(inputImageTexture2, texPos1); |
||||||
|
mediump vec4 newColor2 = texture2D(inputImageTexture2, texPos2); |
||||||
|
|
||||||
|
mediump vec4 newColor = mix(newColor1, newColor2, fract(blueColor)); |
||||||
|
|
||||||
|
newColor.rgb = mix(originColor.rgb, newColor.rgb, strength); |
||||||
|
|
||||||
|
gl_FragColor = vec4(newColor.rgb, textureColor.w); |
||||||
|
} |
||||||
@ -0,0 +1,150 @@ |
|||||||
|
#extension GL_OES_EGL_image_external : require |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
varying highp vec2 textureCoordinate; |
||||||
|
|
||||||
|
uniform samplerExternalOES inputImageTexture; |
||||||
|
uniform sampler2D curve; |
||||||
|
|
||||||
|
uniform sampler2D grey1Frame; |
||||||
|
uniform sampler2D grey2Frame; |
||||||
|
uniform sampler2D grey3Frame; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
float GreyVal; |
||||||
|
lowp vec4 textureColor; |
||||||
|
lowp vec4 textureColorOri; |
||||||
|
float xCoordinate = textureCoordinate.x; |
||||||
|
float yCoordinate = textureCoordinate.y; |
||||||
|
|
||||||
|
highp float redCurveValue; |
||||||
|
highp float greenCurveValue; |
||||||
|
highp float blueCurveValue; |
||||||
|
|
||||||
|
vec4 grey1Color; |
||||||
|
vec4 grey2Color; |
||||||
|
vec4 grey3Color; |
||||||
|
|
||||||
|
textureColor = texture2D( inputImageTexture, vec2(xCoordinate, yCoordinate)); |
||||||
|
|
||||||
|
grey1Color = texture2D(grey1Frame, vec2(xCoordinate, yCoordinate)); |
||||||
|
grey2Color = texture2D(grey2Frame, vec2(xCoordinate, yCoordinate)); |
||||||
|
grey3Color = texture2D(grey3Frame, vec2(xCoordinate, yCoordinate)); |
||||||
|
|
||||||
|
mediump vec4 overlay = vec4(0, 0, 0, 1.0); |
||||||
|
mediump vec4 base = textureColor; |
||||||
|
|
||||||
|
// overlay blending |
||||||
|
mediump float ra; |
||||||
|
if (base.r < 0.5) |
||||||
|
{ |
||||||
|
ra = overlay.r * base.r * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ra = 1.0 - ((1.0 - base.r) * (1.0 - overlay.r) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ga; |
||||||
|
if (base.g < 0.5) |
||||||
|
{ |
||||||
|
ga = overlay.g * base.g * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ga = 1.0 - ((1.0 - base.g) * (1.0 - overlay.g) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
mediump float ba; |
||||||
|
if (base.b < 0.5) |
||||||
|
{ |
||||||
|
ba = overlay.b * base.b * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ba = 1.0 - ((1.0 - base.b) * (1.0 - overlay.b) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
textureColor = vec4(ra, ga, ba, 1.0); |
||||||
|
base = (textureColor - base) * (grey1Color.r*0.1019) + base; |
||||||
|
|
||||||
|
|
||||||
|
// step2 60% opacity ExclusionBlending |
||||||
|
textureColor = vec4(base.r, base.g, base.b, 1.0); |
||||||
|
mediump vec4 textureColor2 = vec4(0.098, 0.0, 0.1843, 1.0); |
||||||
|
textureColor2 = textureColor + textureColor2 - (2.0 * textureColor2 * textureColor); |
||||||
|
|
||||||
|
textureColor = (textureColor2 - textureColor) * 0.6 + textureColor; |
||||||
|
|
||||||
|
// step3 normal blending with original |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 0.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 0.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 0.0)).b; |
||||||
|
|
||||||
|
textureColorOri = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
textureColor = (textureColorOri - textureColor) * grey2Color.r + textureColor; |
||||||
|
|
||||||
|
// step4 normal blending with original |
||||||
|
redCurveValue = texture2D(curve, vec2(textureColor.r, 1.0)).r; |
||||||
|
greenCurveValue = texture2D(curve, vec2(textureColor.g, 1.0)).g; |
||||||
|
blueCurveValue = texture2D(curve, vec2(textureColor.b, 1.0)).b; |
||||||
|
|
||||||
|
textureColorOri = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
textureColor = (textureColorOri - textureColor) * (grey3Color.r) * 1.0 + textureColor; |
||||||
|
|
||||||
|
|
||||||
|
overlay = vec4(0.6117, 0.6117, 0.6117, 1.0); |
||||||
|
base = textureColor; |
||||||
|
// overlay blending |
||||||
|
if (base.r < 0.5) |
||||||
|
{ |
||||||
|
ra = overlay.r * base.r * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ra = 1.0 - ((1.0 - base.r) * (1.0 - overlay.r) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
if (base.g < 0.5) |
||||||
|
{ |
||||||
|
ga = overlay.g * base.g * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ga = 1.0 - ((1.0 - base.g) * (1.0 - overlay.g) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
if (base.b < 0.5) |
||||||
|
{ |
||||||
|
ba = overlay.b * base.b * 2.0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
ba = 1.0 - ((1.0 - base.b) * (1.0 - overlay.b) * 2.0); |
||||||
|
} |
||||||
|
|
||||||
|
textureColor = vec4(ra, ga, ba, 1.0); |
||||||
|
base = (textureColor - base) + base; |
||||||
|
|
||||||
|
// step5-2 30% opacity ExclusionBlending |
||||||
|
textureColor = vec4(base.r, base.g, base.b, 1.0); |
||||||
|
textureColor2 = vec4(0.113725, 0.0039, 0.0, 1.0); |
||||||
|
textureColor2 = textureColor + textureColor2 - (2.0 * textureColor2 * textureColor); |
||||||
|
|
||||||
|
base = (textureColor2 - textureColor) * 0.3 + textureColor; |
||||||
|
redCurveValue = texture2D(curve, vec2(base.r, 1.0)).a; |
||||||
|
greenCurveValue = texture2D(curve, vec2(base.g, 1.0)).a; |
||||||
|
blueCurveValue = texture2D(curve, vec2(base.b, 1.0)).a; |
||||||
|
|
||||||
|
// step6 screen with 60% |
||||||
|
base = vec4(redCurveValue, greenCurveValue, blueCurveValue, 1.0); |
||||||
|
overlay = vec4(1.0, 1.0, 1.0, 1.0); |
||||||
|
|
||||||
|
// screen blending |
||||||
|
textureColor = 1.0 - ((1.0 - base) * (1.0 - overlay)); |
||||||
|
textureColor = (textureColor - base) * 0.05098 + base; |
||||||
|
|
||||||
|
gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, 1.0); |
||||||
|
} |
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue