Skip to content

Commit

Permalink
Improved processing speed, updated GPU alignment
Browse files Browse the repository at this point in the history
  • Loading branch information
eszdman committed Jul 28, 2021
1 parent 7775576 commit 7f3770a
Show file tree
Hide file tree
Showing 22 changed files with 460 additions and 291 deletions.
26 changes: 13 additions & 13 deletions app/src/main/assets/convdiff.glsl
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
#version 300 es
#define SIZE 1
#define INSIZE 1
#define INSIZE 1,1
#define tvar vec2
#define tscal float
#define TSAMP sampler2D
#define coordstp(x,y) (ivec2(y,x))
#define stepping(i,j) (coordstp(-1+j,i))
#define stepping2(i,j) (coordstp(1+j,i))
#define stepping0(i,j) (coordstp(0+j,i))
#define stepping3(i,j) (coordstp(-2+j,i))
#define stepping4(i,j) (coordstp(2+j,i))

#define BLURRING algorithm
precision mediump TSAMP;
precision mediump tscal;

uniform float rotation;
uniform TSAMP InputBuffer;
#define GRADSHIFT 0.5
#define j 0
#define i 0
#define sum(vecin) (vecin.r+vecin.g)
Expand All @@ -31,10 +24,17 @@ void main() {
xy.y = int(xy2.y*sin(rotation)+xy2.y*cos(rotation));
xy+=insizev/2;
}
vec2 center = texelFetch(InputBuffer, xy,0).rg;
Output.g = sum(texelFetch(InputBuffer, mirrorCoords2(xy+ivec2(1,0),ivec2(INSIZE)),0).rg)-sum(center);
Output.r = sum(texelFetch(InputBuffer, mirrorCoords2(xy+ivec2(0,1),ivec2(INSIZE)),0).rg)-sum(center);
//vec2 center = texelFetch(InputBuffer, xy,0).rg;
//for(int i =-3; i<3;i++){
//Output.r += sum(texelFetch(InputBuffer, mirrorCoords2(xy-ivec2(i,1),ivec2(INSIZE)),0).rg)-sum(texelFetch(InputBuffer, xy+ivec2(i,1),0).rg);
//Output.g += sum(texelFetch(InputBuffer, mirrorCoords2(xy-ivec2(1,i),ivec2(INSIZE)),0).rg)-sum(texelFetch(InputBuffer, xy+ivec2(i,1),0).rg);
Output.r = sum(texelFetch(InputBuffer, mirrorCoords2(xy-ivec2(i,1),ivec2(INSIZE)),0).rg)-sum(texelFetch(InputBuffer, xy+ivec2(i,1),0).rg);
Output.g = sum(texelFetch(InputBuffer, mirrorCoords2(xy-ivec2(1,i),ivec2(INSIZE)),0).rg)-sum(texelFetch(InputBuffer, xy+ivec2(i,1),0).rg);
//}
//Output/=6.0;

//Output*=max(1.0-abs((center.r+center.g)/2.0 - 0.5)*1.9,0.0);
//Output=max(min((Output-0.02)*10.0,1.0),0.0);
Output=(Output)/float(1);
Output=(Output)/2.0;
Output+=GRADSHIFT;
}
27 changes: 20 additions & 7 deletions app/src/main/assets/corners.glsl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#version 300 es
#define SIZE 1
#define SIZE 2
#define INSIZE 1, 1
#define tvar vec2
#define tscal float
Expand All @@ -15,19 +15,32 @@ void main(){
float y1 = 0.0;
float y2 = 0.0;
float maxCorner = 0.0;
for(int i = -3; i<=3;i++){
for(int j = -3; j<=3;j++){
vec2 dxy = texelFetch(InputBufferdxy,mirrorCoords2(xy+ivec2(i,j),ivec2(INSIZE)),0).rg
vec2 totaldxy = vec2(0.0);
vec4 M = vec4(0.0,0.0,0.0,0.0);
for(int i = -SIZE; i<=SIZE;i++){
for(int j = -SIZE; j<=SIZE;j++){
/*vec2 dxy = texelFetch(InputBufferdxy,mirrorCoords2(xy+ivec2(i,j),ivec2(INSIZE)),0).rg
*unscaledGaussian(float(i),0.8)*unscaledGaussian(float(j),0.8);
float corner = (dxy.x*dxy.x) + (dxy.y*dxy.y) - (dxy.x*dxy.y)*(dxy.x*dxy.y) - 0.05*(dxy.x*dxy.x + dxy.y*dxy.y);
if(corner > maxCorner){
maxCorner = corner;
}
}*/
vec2 dref = texelFetch(InputBufferdxy,mirrorCoords2(xy+ivec2(i,j),ivec2(INSIZE)),0).rg
*unscaledGaussian(float(i)/float(SIZE),0.8)
*unscaledGaussian(float(j)/float(SIZE),0.8);
M.r += dref.r*dref.r;
M.g += dref.r*dref.g;
M.b += dref.r*dref.g;
M.a += dref.g*dref.g;
}
}
float det = M.r*M.a - M.g*M.b;
//float left = (totaldxy.x*totaldxy.x + totaldxy.y*totaldxy.y) / 2.0;
//float b = (totaldxy.x*totaldxy.x - totaldxy.y*totaldxy.y) / 2.0;
//float right = (b*b + totaldxy.x*totaldxy.y*totaldxy.x*totaldxy.y);
//Output.r = y1*y2 - 0.05*(y1+y2);
Output.r = maxCorner;
Output.g = maxCorner;
Output.r = det/(M.r+M.a);
Output.g = 4.0*det/((M.r+M.a)*(M.r+M.a));
//if(y1 > y2) Output = texelFetch(InputBufferdxy,xy,0).rg;
//if(Output.r < 0.08) Output.r = 0.0;
//if(Output.r+Output.g < 0.03) Output = vec2(0.0);
Expand Down
1 change: 1 addition & 0 deletions app/src/main/assets/import_coords.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ ivec2 mirrorCoords2(ivec2 xy, ivec2 bounds){
xy.y = 2*bounds.g-(xy.y%(bounds.g*2));
}
}*/
bounds-=ivec2(1);
xy%=bounds*2;
if(xy.x < 0 || xy.x > bounds.x) xy.x = (bounds.x*2-xy.x)%bounds.x;
if(xy.y < 0 || xy.y > bounds.y) xy.y = (bounds.y*2-xy.y)%bounds.y;
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/assets/import_hsvtoxyz.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
vec3 hsvtoxyz(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);
}
13 changes: 13 additions & 0 deletions app/src/main/assets/import_vectortorgb.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
vec3 hsvtoxyzP(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);
}
vec3 vectortorgb(vec2 V){
float r = sqrt(V.x * V.x + V.y * V.y);
float angle = atan(V.y, V.x);
angle = angle / 2.0 / PI;
vec3 hsv = hsvtoxyzP(vec3(angle, 1.0, clamp(r, 0.0, 1.0)));
return hsv;
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public GLProg() {
boolean changedDef = false;
ArrayList<String[]> Defines = new ArrayList<>();
public void setDefine(String DefineName, Point in){
setDefine(DefineName,(float)in.x,(float)in.y);
setDefine(DefineName,in.x,in.y);
}
public void setDefine(String DefineName, boolean bool){
if(bool)
Expand All @@ -92,54 +92,10 @@ public void setDefine(String DefineName, float... vars){
setDefine(DefineName,true,vars);
}
public void setDefine(String DefineName,boolean transposed, float... vars){
switch (vars.length) {
case 1:
setDefine(DefineName,String.valueOf(vars[0]));
break;
case 2:
setDefine(DefineName,vars[0]+","+vars[1]);
break;
case 3:
setDefine(DefineName,vars[0]+","+vars[1]+","+vars[2]);
break;
case 4:
setDefine(DefineName,vars[0]+","+vars[1]+","+vars[2]+","+vars[3]);
break;
case 9:
if(transposed) {
float[] transpose = new float[9];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
transpose[j + i * 3] = vars[i + j * 3];
}
}
setDefine(DefineName,Arrays.toString(transpose).replace("]","").replace("[",""));
} else setDefine(DefineName,Arrays.toString(vars).replace("]","").replace("[",""));

break;
default:
setDefine(DefineName,Arrays.toString(vars).replace("]","").replace("[",""));
break;
}
setDefine(DefineName,Arrays.toString(vars).replace("]","").replace("[",""));
}
public void setDefine(String DefineName, int... vars){
switch (vars.length) {
case 1:
setDefine(DefineName,"("+(vars[0])+")");
break;
case 2:
setDefine(DefineName,"("+vars[0]+","+vars[1]+")");
break;
case 3:
setDefine(DefineName,"("+vars[0]+","+vars[1]+","+vars[2]+")");
break;
case 4:
setDefine(DefineName,"("+vars[0]+","+vars[1]+","+vars[2]+","+vars[3]+")");
break;
default:
setDefine(DefineName,"("+ Arrays.toString(vars).replace("]","").replace("[","")+")");
break;
}
setDefine(DefineName,Arrays.toString(vars).replace("]","").replace("[",""));
}
public void setDefine(String DefineName, String DefineVal){
Defines.add(new String[]{DefineName,DefineVal});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -499,26 +499,15 @@ public void Corners(GLTexture dxy,GLTexture out){
glProg.drawBlocks(out,dxy.mSize);
glProg.closed = true;
}
public void ConvDiff(GLTexture in, GLTexture out, int size,boolean vertical,boolean blurring){
ConvDiff(in,out,size,vertical,blurring,0.f);
}
public void ConvDiff(GLTexture in, GLTexture out, int size,boolean vertical,boolean blurring, float rotation){
String blurringS = "float dist2 = 1.0+4.0*abs(float(i)/float(SIZE))+4.0*abs(float(j)/float(SIZE));" +
"Output+=(-tvar(texelFetch(InputBuffer, mirrorCoords2(xy+stepping(i,j),ivec2(INSIZE)),0)"+in.mFormat.getTemExt()+")*0.0" +
"+tvar(texelFetch(InputBuffer, mirrorCoords2(xy+stepping0(i,j),ivec2(INSIZE)),0))"+in.mFormat.getTemExt()+"*1.0"+
"-tvar(texelFetch(InputBuffer, mirrorCoords2(xy+stepping2(i,j),ivec2(INSIZE)),0))"+in.mFormat.getTemExt()+
//"-tvar(texelFetch(InputBuffer, mirrorCoords2(xy+stepping4(i,j),ivec2(INSIZE)),0))"+in.mFormat.getTemExt()+"*0.0" +
")/dist2;\n";
if(blurring) blurringS = " Output+=abs(tvar(texelFetch(InputBuffer, mirrorCoords2(xy+stepping0(i),ivec2(INSIZE)),0)"+in.mFormat.getTemExt()+"));\n";
if(vertical) glProg.setDefine("coordstp(x,y)","(ivec2(y,x))");
else glProg.setDefine("coordstp(x,y)","(ivec2(x,y))");
public void ConvDiff(GLTexture in, GLTexture out, float gradientShift){
ConvDiff(in,out,gradientShift,0);
}
public void ConvDiff(GLTexture in, GLTexture out, float gradientShift, float rotation){
glProg.setDefine("tvar",in.mFormat.getTemVar());
glProg.setDefine("tscal",in.mFormat.getScalar());
glProg.setDefine("TSAMP",in.mFormat.getTemSamp());
glProg.setDefine("BLURRING",blurringS);
glProg.setDefine("BLURRING",blurringS);
glProg.setDefine("INSIZE", Utilities.addP(in.mSize,-1));
glProg.setDefine("SIZE",size);
glProg.setDefine("INSIZE", in.mSize);
glProg.setDefine("GRADSHIFT",gradientShift);
glProg.useProgram(PhotonCamera.getAssetLoader().getString("convdiff.glsl"));
glProg.setVar("rotation",rotation);
glProg.setTexture("InputBuffer",in);
Expand Down Expand Up @@ -877,16 +866,23 @@ public Pyramid createPyramid(int levels, double step, GLTexture input){
pyramid.laplace = diff;
return pyramid;
}
public Bitmap GenerateBitmap(Point size){
return GenerateBitmap(size,4);
}
public Bitmap GenerateBitmap(Point size, int channels){
GLFormat bitmapF = new GLFormat(GLFormat.DataType.UNSIGNED_8, channels);
Bitmap preview = Bitmap.createBitmap((int)(((double)size.x*channels)/4), size.y, bitmapF.getBitmapConfig());
preview.copyPixelsFromBuffer(glProcessing.drawBlocksToOutput(size, bitmapF));
return preview;
}
public Bitmap SaveProgResult(Point size){
return SaveProgResult(size, "");
}
public Bitmap SaveProgResult(Point size, String namesuffix){
return SaveProgResult(size, namesuffix, 4,".jpg");
}
public Bitmap SaveProgResult(Point size, String namesuffix, int channels,String ext){
GLFormat bitmapF = new GLFormat(GLFormat.DataType.UNSIGNED_8, channels);
Bitmap preview = Bitmap.createBitmap((int)(((double)size.x*channels)/4), size.y, bitmapF.getBitmapConfig());
preview.copyPixelsFromBuffer(glProcessing.drawBlocksToOutput(size, bitmapF));
Bitmap preview = GenerateBitmap(size,channels);
if(!namesuffix.equals("")) {
File debug = new File(jpgFilePathToSave.toString().replace(".jpg","") + namesuffix + ext);
FileOutputStream fOut = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ public Node(int rid, String name) {
private void tuningLog(String name, String value){
if(loggedTuning) Log.d("Tuning",name+" = "+ value);
}
public boolean getTuning(String name, boolean Default){
tuningLog(Name+"_"+name,String.valueOf(Default));
return Boolean.parseBoolean(mProp.getProperty(Name+"_"+name,String.valueOf(Default)));
}
public float getTuning(String name,float Default){
tuningLog(Name+"_"+name,String.valueOf(Default));
return Float.parseFloat(mProp.getProperty(Name+"_"+name,String.valueOf(Default)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,12 @@ public Equalization() {
}
private static final float MIN_GAMMA = 0.55f;
private final PorterDuffXfermode porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.ADD);
private void GenerateCurveBitm(float[] curve,float[] BL){
private void GenerateCurveBitmWB(float[] curve, float[] BL, float[] WB){
Bitmap CurveEQ = Bitmap.createBitmap(256,256, Bitmap.Config.ARGB_8888);
((PostPipeline)basePipeline).debugData.add(CurveEQ);
Utilities.drawArray(curve,CurveEQ);
Utilities.drawBL(BL,CurveEQ);
Utilities.drawWL(new float[]{0.9f,0.9f,0.9f},CurveEQ);//Test WL draw
Utilities.drawWB(new float[]{0.9f,0.9f,0.9f},CurveEQ);//Test WL draw
}
private void GenerateCurveBitm(int[] curve){
Bitmap CurveEQ = Bitmap.createBitmap(256,256, Bitmap.Config.ARGB_8888);
Expand Down Expand Up @@ -375,6 +375,61 @@ private float[] bezier2(float[] input){
}
return output;
}*/
class Minindexes implements Comparable<Minindexes>{
public float r,g,b;
public int ind;
private float dist(){
float r2,g2,b2;
r2 = r/(r+g+b);
g2 = g/(r+g+b);
b2 = b/(r+g+b);
return (float)Math.sqrt(r2*r2 + g2*g2 + b2*b2);
}
public Minindexes(float r, float g, float b, int ind){
this.r = r;
this.g = g;
this.b = b;
this.ind = ind;
}
@Override
public int compareTo(Minindexes o) {
int out = (int)((dist()-o.dist())*1000.f);
if(out ==0) out = 1;
return out;
}
}
private float[] getWB(float[] histr, float[] histg, float[] histb, float[] blwl){
int searchMax = (int) mix(blwl[0],blwl[1],whiteBalanceSearch/((float)histSize));
float rk = 0.f;
float gk = 0.f;
float bk = 0.f;
float cnt = 0.f;
float mindist = 1000.f;
Minindexes[] minindexes = new Minindexes[histSize];
for(int i =0; i<histSize;i++){
minindexes[i] = new Minindexes(histr[i],histg[i],histb[i],i);
}
Arrays.sort(minindexes);
for(int i = 0; i<searchMax;i++){
rk+=
cnt+=1.f;
}
//float rk = Utilities.linearRegressionK(Arrays.copyOfRange(histr,histr.length-1-searchMax,histr.length))+0.0001f;
//float gk = Utilities.linearRegressionK(Arrays.copyOfRange(histg,histg.length-1-searchMax,histg.length))+0.0001f;
//float bk = Utilities.linearRegressionK(Arrays.copyOfRange(histb,histb.length-1-searchMax,histb.length))+0.0001f;
float[] outp = new float[]{rk,gk,bk};
float mink = Math.min(Math.min(outp[0],outp[1]),outp[2]);
outp[0]/=mink;
outp[1]/=mink;
outp[2]/=mink;
outp = Utilities.saturate(outp,whiteBalanceSaturation);
Log.d(Name,"WBK:"+Arrays.toString(outp));
mink = Math.min(Math.min(outp[0],outp[1]),outp[2]);
outp[0]/=mink;
outp[1]/=mink;
outp[2]/=mink;
return new float[]{outp[0],outp[1],outp[2]};
}
GLTexture lut;
Bitmap lutbm;
float analyzeIntensity = -0.35f;
Expand All @@ -389,6 +444,9 @@ private float[] bezier2(float[] input){
float highLightSmoothAmplify = 2.f;
float shadowsSensitivity = 0.6f;
float blackLevelSensitivity = 1.1f;

int whiteBalanceSearch = 400;
float whiteBalanceSaturation = 1.35f;
@Override
public void Run() {
analyzeIntensity = getTuning("AnalyzeIntensity", analyzeIntensity);
Expand All @@ -403,6 +461,7 @@ public void Run() {
histSize = getTuning("HistSize", histSize);
blackLevelSearch = getTuning("BlackLevelSearch", blackLevelSearch);
blackLevelSensitivity = getTuning("BlackLevelSensitivity", blackLevelSensitivity);
whiteBalanceSearch = getTuning("WhiteBalanceSearch", whiteBalanceSearch);
WorkingTexture = basePipeline.getMain();
float rmax = (float)(Math.sqrt(basePipeline.mParameters.noiseModeler.computeModel[0].second) + Math.sqrt(basePipeline.mParameters.noiseModeler.computeModel[0].first));
float gmax = (float)(Math.sqrt(basePipeline.mParameters.noiseModeler.computeModel[1].second) + Math.sqrt(basePipeline.mParameters.noiseModeler.computeModel[1].first));
Expand Down Expand Up @@ -488,11 +547,14 @@ public void Run() {
double compensation = averageCurve.length/WL;
histParser.hist = bilateralSmoothCurve(histParser.hist,blwl);

float[] WB = getWB(histParser.histr,histParser.histg,histParser.hist,blwl);

//Use kx+b prediction for curve start
//Depurple Degreen
float[] BLPredict = new float[3];
float[] BLPredictShift = new float[3];
int maxshift = (int) (blwl[0] + blwl[1]*blackLevelSearch/4096.f);
//int maxshift = (int) (blwl[0] + blwl[1]*blackLevelSearch/4096.f);
int maxshift = (int) mix(blwl[0],blwl[1],blackLevelSearch/((float)histSize));
maxshift = Math.max(maxshift,10);
Log.d(Name,"BlSearch:"+maxshift);
int cnt = 0;
Expand Down Expand Up @@ -564,7 +626,8 @@ public void Run() {
} else
histParser.hist[i] = 1.f;
}*/
Log.d(Name,"PredictedShift:"+Arrays.toString(BLPredictShift));
Log.d(Name,"PredictedBLShift:"+Arrays.toString(BLPredictShift));
Log.d(Name,"PredictedWBKoeff:"+Arrays.toString(WB));
if(basePipeline.mSettings.DebugData)GenerateCurveBitm(histParser.histInr,histParser.histIng,histParser.histInb);


Expand Down Expand Up @@ -592,7 +655,7 @@ public void Run() {
}
//histParser.hist[i] = mix(histParser.hist[i],line,line*0.35f);
}
if(basePipeline.mSettings.DebugData) GenerateCurveBitm(histParser.hist,BLPredictShift);
if(basePipeline.mSettings.DebugData) GenerateCurveBitmWB(histParser.hist,BLPredictShift,WB);
GLTexture histogram = new GLTexture(histParser.hist.length,1,new GLFormat(GLFormat.DataType.FLOAT_16),
FloatBuffer.wrap(histParser.hist), GL_LINEAR, GL_CLAMP_TO_EDGE);
//GLTexture shadows = new GLTexture(histParser.hist.length,1,new GLFormat(GLFormat.DataType.FLOAT_16,3),
Expand Down
Loading

0 comments on commit 7f3770a

Please sign in to comment.