parent
6055af2d8b
commit
605e60e744
@ -1,42 +0,0 @@ |
|||||||
package com.frank.camerafilter.filter.advance; |
|
||||||
|
|
||||||
import android.content.Context; |
|
||||||
import android.opengl.GLES20; |
|
||||||
|
|
||||||
import com.frank.camerafilter.R; |
|
||||||
import com.frank.camerafilter.filter.BaseFilter; |
|
||||||
import com.frank.camerafilter.util.OpenGLUtil; |
|
||||||
|
|
||||||
public class BeautyCrayonFilter extends BaseFilter { |
|
||||||
|
|
||||||
// 1.0--5.0
|
|
||||||
private int mStrengthLocation; |
|
||||||
|
|
||||||
private int mStepOffsetLocation; |
|
||||||
|
|
||||||
public BeautyCrayonFilter(Context context) { |
|
||||||
super(NORMAL_VERTEX_SHADER, OpenGLUtil.readShaderFromSource(context, R.raw.crayon)); |
|
||||||
} |
|
||||||
|
|
||||||
protected void onInit() { |
|
||||||
super.onInit(); |
|
||||||
mStrengthLocation = GLES20.glGetUniformLocation(getProgramId(), "strength"); |
|
||||||
mStepOffsetLocation = GLES20.glGetUniformLocation(getProgramId(), "singleStepOffset"); |
|
||||||
} |
|
||||||
|
|
||||||
protected void onInitialized() { |
|
||||||
super.onInitialized(); |
|
||||||
setFloat(mStrengthLocation, 2.0f); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void onInputSizeChanged(int width, int height) { |
|
||||||
super.onInputSizeChanged(width, height); |
|
||||||
setFloatVec2(mStepOffsetLocation, new float[] {1.0f / width, 1.0f / height}); |
|
||||||
} |
|
||||||
|
|
||||||
protected void onDestroy() { |
|
||||||
super.onDestroy(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,33 @@ |
|||||||
|
package com.frank.camerafilter.filter.advance; |
||||||
|
|
||||||
|
import android.content.Context; |
||||||
|
import android.opengl.GLES30; |
||||||
|
|
||||||
|
import com.frank.camerafilter.R; |
||||||
|
import com.frank.camerafilter.filter.BaseFilter; |
||||||
|
import com.frank.camerafilter.util.OpenGLUtil; |
||||||
|
|
||||||
|
public class BeautyHueFilter extends BaseFilter { |
||||||
|
|
||||||
|
private int hueAdjust; |
||||||
|
|
||||||
|
public BeautyHueFilter(Context context) { |
||||||
|
super(NORMAL_VERTEX_SHADER, OpenGLUtil.readShaderFromSource(context, R.raw.hue)); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInit() { |
||||||
|
super.onInit(); |
||||||
|
hueAdjust = GLES30.glGetUniformLocation(getProgramId(), "hueAdjust"); |
||||||
|
} |
||||||
|
|
||||||
|
protected void onInitialized() { |
||||||
|
super.onInitialized(); |
||||||
|
setFloat(hueAdjust, 3.0f); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onInputSizeChanged(int width, int height) { |
||||||
|
super.onInputSizeChanged(width, height); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,53 +0,0 @@ |
|||||||
varying highp vec2 textureCoordinate; |
|
||||||
precision mediump float; |
|
||||||
|
|
||||||
uniform sampler2D 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,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; |
||||||
|
} |
Loading…
Reference in new issue