Welcome, Guest.
Username: Password: Remember me

TOPIC: White point adjuster

White point adjuster 4 months 2 weeks ago #1

This shader allows you to change the white point in the xyY space of CIE 1931 and thus allows for easy white balancing:



(NB. with either debug setting get your grey point to go black (0,0,0) to set a white balance; I eyeballed this one and right is mine, so IDK if it's exact.)




#include "ReShadeUI.fxh"

uniform float2 Customxy < __UNIFORM_DRAG_FLOAT2
	ui_min = 0.0; ui_step=0.000001; ui_max = 1.0;
> =float2(0.312727,0.329023);

uniform bool Two_dimensional_input <> = false;

uniform int Two_dimensional_input_type <__UNIFORM_COMBO_INT1
    ui_items = "Crosshairs on\0Crosshairs off\0Direct point-based\0";
	> = 0;

uniform float Two_dimensional_input_Range < __UNIFORM_SLIDER_FLOAT1
	ui_min = 2.0; ui_max = 0.0;
> = 2.0;

uniform bool Split <> = false;

uniform bool Flip_split <> = false;

uniform bool Debug <> = false;

uniform float Split_position < __UNIFORM_SLIDER_FLOAT1
	ui_min = 0; ui_max =1;
	ui_tooltip = "0 is on the far left, 1 on the far right.";
> = 0.5;


uniform int Debug_type < __UNIFORM_COMBO_INT1
    ui_items = "Max from grey\0RGB debug\0Max RGB\0";
    ui_tooltip = "Crushing to 0.5 has a stronger de-dither effect but loses more information.";
> = 0;

uniform float Debug_amplification < __UNIFORM_DRAG_FLOAT1
	ui_min = 0.0000001; ui_max =2;
	ui_tooltip = "A lower value exaggerates small differences more";
> = 0.5;

#include "ReShade.fxh"
#include "DrawText_mod.fxh"

uniform bool buttondown < source = "mousebutton"; keycode = 0; mode = ""; >;

uniform float2 mousepoint < source = "mousepoint"; >;



float3 WPconv(float3 XYZ,float3 from, float3 to){

float3x3 Bradford=float3x3(0.8951,0.2664,-0.1614,
-0.7502,1.7135,0.0367,
0.0389,-0.0685,1.0296);

float3x3 BradfordInv=float3x3(0.9869929,-0.1470543,0.1599627,
0.4323053,0.5183603,0.0492912,
-0.0085287,0.0400428,0.9684867);


float3 BradFrom= mul(Bradford,from);
float3 BradTo= mul(Bradford,to);

float3x3 CR=float3x3(BradTo.x/BradFrom.x,0,0,
0,BradTo.y/BradFrom.y,0,
0,0,BradTo.z/BradFrom.z);

float3x3 convBrad= mul(mul(BradfordInv,CR),Bradford);

float3 outp=mul(convBrad,XYZ);
return outp;


}

float3 WPconv2Grey(float3 from, float3 to){

float3x3 Bradford=float3x3(0.8951,0.2664,-0.1614,
-0.7502,1.7135,0.0367,
0.0389,-0.0685,1.0296);

float3x3 BradfordInv=float3x3(0.9869929,-0.1470543,0.1599627,
0.4323053,0.5183603,0.0492912,
-0.0085287,0.0400428,0.9684867);

float3 BradFrom= mul(Bradford,from);
float3 BradTo= mul(Bradford,to);

float3x3 CR=float3x3(BradTo.x/BradFrom.x,0,0,
0,BradTo.y/BradFrom.y,0,
0,0,BradTo.z/BradFrom.z);

float3x3 convBrad= mul(mul(BradfordInv,CR),Bradford);

float3 outp=mul(convBrad,float3(0.95047,1,1.08883));

return outp;

}

float3 rgb2xyY(float3 rgb){

    float3 rgbNew=float3(rgb.r,rgb.g,rgb.b); 

	float3 XYZ;

	rgbNew=(rgbNew > 0.0404482362771082)?pow(abs((rgbNew+0.055)/1.055),2.4):rgbNew/12.92;

		XYZ.x = dot(float3(0.4124564,0.3575761, 0.1804375), rgbNew);
		XYZ.y = dot(float3(0.2126729,0.7151522,0.072175), rgbNew);
		XYZ.z = dot(float3(0.0193339,0.119192,0.9503041), rgbNew);

	float XYZtot=XYZ.x+XYZ.y+XYZ.z;
	
	float x=XYZ.x/XYZtot;
	float y=XYZ.y/XYZtot;
	
	return float3(x,y,XYZ.y);

}

//Source: https://stackoverflow.com/a/45263428; http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html

float3 xyY2XYZ(float3 xyY){
	float X=(xyY.z/xyY.y)*xyY.x;
	float Z=(xyY.z/xyY.y)*(1-xyY.x-xyY.y);
	
	return float3(X,xyY.z,Z);
}

float3 XYZ2xyY(float3 XYZ){
	float XYZtot=XYZ.x+XYZ.y+XYZ.z;
	
	float x=XYZ.x/XYZtot;
	float y=XYZ.y/XYZtot;
	return float3(x,y,XYZ.y);
}

float3 XYZ2xyY_Grey(float3 XYZ){
	float XYZtot=XYZ.x+XYZ.y+XYZ.z;
	
	float x=XYZ.x/XYZtot;
	float y=XYZ.y/XYZtot;
	return float3(x,y,XYZ.y);
}


float3 xyY2rgb(float3 xyY){

float Y=xyY.z;
float X=(Y/xyY.y)*xyY.x;
float Z=(Y/xyY.y)*(1-xyY.x-xyY.y);

float3 RGB;

 RGB.r = dot(float3(3.2404542,-1.5371385,-0.4985314),float3(X,Y,Z));
 RGB.g = dot(float3(-0.969266,1.8760108,0.041556),float3(X,Y,Z));
 RGB.b = dot(float3(0.0556434,-0.2040259,1.0572252),float3(X,Y,Z));

	RGB=( RGB > 0.00313066844250063 )?1.055 * pow(abs(RGB),1/2.4) - 0.055:12.92 *RGB;

return RGB;

}
//Source: http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html


float2 rgb2Grey_xy (float3 rgb){

	float3 XYZog;
	float3 XYZnew;

	float3 rgbLin=(rgb > 0.0404482362771082)?pow(abs((rgb+0.055)/1.055),2.4):rgb/12.92;

float rgbNewTot=rgbLin.r+rgbLin.g+rgbLin.b;
float rgbNewAvg=pow(3,-1)*rgbNewTot;

float3 rgbNew=float3(rgbNewAvg,rgbNewAvg,rgbNewAvg);

		XYZog.x = dot(float3(0.4124564,0.3575761, 0.1804375), rgbLin);
		XYZog.y = dot(float3(0.2126729,0.7151522,0.072175), rgbLin);
		XYZog.z = dot(float3(0.0193339,0.119192,0.9503041), rgbLin);

		XYZnew.x = dot(float3(0.4124564,0.3575761, 0.1804375), rgbNew);
		XYZnew.y = dot(float3(0.2126729,0.7151522,0.072175), rgbNew);
		XYZnew.z = dot(float3(0.0193339,0.119192,0.9503041), rgbNew);
		
		return XYZ2xyY_Grey(WPconv2Grey(XYZog,XYZnew)).xy;
		
}


float3 WPChangeRGB(float3 color, float3 from, float3 to){

return xyY2rgb(XYZ2xyY(WPconv(xyY2XYZ(rgb2xyY(color.rgb)),from,to)));

}


float3 WPChangexyY(float3 color, float3 from, float3 to){

return XYZ2xyY(WPconv(xyY2XYZ(color.xyz),from,to));

}

float3 WPChangeXYZ(float3 color, float3 from, float3 to){

return WPconv(xyY2XYZ(rgb2xyY(color.xyz)),from,to);

}

float3 xy2XYZ(float2 xyCoord){

return float3((1/xyCoord.y)*xyCoord.x,1,(1/xyCoord.y)*(1-xyCoord.x-xyCoord.y));
}


float4 whitePoint(float4 color,float on, float2 CustomxyIn){

float4 c0=color;

float2 D65xy=float2(0.312727,0.329023);

float3 D65XYZ=xy2XYZ(D65xy);
float3 CustomXYZ=xy2XYZ(CustomxyIn);

float3 from = D65XYZ; 
float3 to = CustomXYZ;

float Debug_amplification=Debug_amplification;

color.rgb= WPChangeRGB(color.rgb, from, to);

color=(on==0)?c0:color;

float rgbTot=color.r+color.g+color.b;
float rgbAvg=pow(3,-1)*rgbTot;

float distGrey=sqrt(pow(abs(rgbAvg-color.r),2)+pow(abs(rgbAvg-color.g),2)+pow(abs(rgbAvg-color.b),2));

float3 debug;

float4 mxDbg=0;
float max_rgb=max(max(color.r,color.g),color.b);
//float debugColor=max(0,abs(-1+Debug_amplification));

mxDbg.r=(color.r==max_rgb)?pow(min(1,distGrey),Debug_amplification):0;
mxDbg.g=(color.g==max_rgb)?pow(min(1,distGrey),Debug_amplification):0;
mxDbg.b=(color.b==max_rgb)?pow(min(1,distGrey),Debug_amplification):0;

float ChkIndenticalmx=abs(mxDbg.r-mxDbg.r)+abs(mxDbg.r-mxDbg.g)+abs(mxDbg.r-mxDbg.b);

mxDbg.rgb=(ChkIndenticalmx==0)?0:mxDbg.rgb;

debug=(Debug_type==1)?pow(abs(rgbAvg-color.rgb),Debug_amplification):pow(abs((pow(abs(distGrey+1),2)-1)*pow(abs(pow(1+0.5*sqrt(3),2)-1),-1)),Debug_amplification);
debug=(Debug_type==2)?mxDbg.rgb:debug;

color.rgb=(Debug!=1)?color.rgb:debug;

return color;
}

float4 WhitePointPass2D(float4 vpos : SV_Position, float2 texcoord : TexCoord) : SV_Target
{

float2 Customxy=Customxy;

float x_Range=(BUFFER_WIDTH>=BUFFER_HEIGHT)?Two_dimensional_input_Range*(BUFFER_RCP_HEIGHT/BUFFER_RCP_WIDTH):Two_dimensional_input_Range;

float y_Range=(BUFFER_WIDTH>=BUFFER_HEIGHT)?Two_dimensional_input_Range:Two_dimensional_input_Range*(BUFFER_RCP_WIDTH/BUFFER_RCP_HEIGHT);

Customxy.x= (buttondown==0 && Two_dimensional_input==1)?  mousepoint.x*ReShade::PixelSize.x*((Customxy.x+0.5*x_Range)-(Customxy.x-0.5*x_Range))+(Customxy.x-0.5*x_Range):Customxy.x;

float xCoord_Pos=(buttondown==1 && Two_dimensional_input==1)?(Customxy.x-(Customxy.x-0.5*x_Range))/((Customxy.x+0.5*x_Range)-(Customxy.x-0.5*x_Range)):mousepoint.x*ReShade::PixelSize.x;

Customxy.y= (buttondown==0 && Two_dimensional_input==1)?mousepoint.y*ReShade::PixelSize.y*((Customxy.y+0.5*y_Range)-(Customxy.y-0.5*y_Range))+(Customxy.y-0.5*y_Range):Customxy.y;

float yCoord_Pos=(buttondown==1 && Two_dimensional_input==1)?(Customxy.y-(Customxy.y-0.5*y_Range))/((Customxy.y+0.5*y_Range)-(Customxy.y-0.5*y_Range)):mousepoint.y*ReShade::PixelSize.y;

float4 c0=tex2D(ReShade::BackBuffer, texcoord);

Customxy=(buttondown==0 && Two_dimensional_input==1 && buttondown==0 && Two_dimensional_input_type==2)?rgb2Grey_xy(tex2D(ReShade::BackBuffer, mousepoint*ReShade::PixelSize).rgb).xy:Customxy;

float4 c1=whitePoint(c0,1,Customxy);
float4 c2=whitePoint(c0,0,Customxy);

float4 c3=(texcoord.x>=Split_position*Split)?c1:c2;
float4 c4=(texcoord.x<=Split_position*Split)?c1:c2;

float4 c5=(Flip_split==1 && Split==1)?c4:c3;

float divLine = abs(texcoord.x - Split_position) < BUFFER_RCP_WIDTH;
c5 =(Split==0)?c5: c5*(1.0 - divLine); //invert divline

c5.rgb =(Two_dimensional_input==1 && Two_dimensional_input_type==0 && (abs(texcoord.x-xCoord_Pos)<BUFFER_RCP_WIDTH || abs(texcoord.y-yCoord_Pos)<BUFFER_RCP_HEIGHT))?float3(0.369,0.745,0):c5.rgb;

c5.rgb =(Two_dimensional_input==1 && Two_dimensional_input_type==1 && (abs(texcoord.x-xCoord_Pos)<3*BUFFER_RCP_WIDTH && abs(texcoord.y-yCoord_Pos)<3*BUFFER_RCP_HEIGHT))?float3(0.498,1,0):c5.rgb;

float4 res =float4(c5.rgb,0);

float textSize=25;

[flatten]if(Two_dimensional_input==1){
    DrawText_Digit(   DrawText_Shift(DrawText_Shift(float2(0.5*BUFFER_WIDTH,0), int2(-14, 0), textSize, 1), int2(8, 0), textSize, 1) , 
						textSize, 1, texcoord,  3, Customxy.x, res,1); //
						
						    DrawText_Digit(   DrawText_Shift(DrawText_Shift(float2(0.5*BUFFER_WIDTH,0), int2(-5, 0), textSize, 1), int2(8, 0), textSize, 1) , 
						textSize, 1, texcoord,  3,  Customxy.y, res,1); //
						
						
						
}

c5.rgb=res.rgb;

return c5;

}

technique White_Point_2D
{
	pass
	{
		VertexShader = PostProcessVS;
		PixelShader = WhitePointPass2D;
	}
}

Requires a modded DrawText header file as well, for the new 2D input (call it "DrawText_mod.fxh"!):
//Original by kingeric1992, modded by crabshank 08/10/2019

#ifndef _DRAWTEXT_H_
#define _DRAWTEXT_H_

#define _DRAWTEXT_GRID_X 14.0
#define _DRAWTEXT_GRID_Y 7.0

///////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                   //
//  Available functions:                                                                             //
//      DrawText_String( offset, text size, xy ratio, input coord, string array, array size, output) //
//          float2 offset       = top left corner of string, screen hight pixel unit.                //
//          float  text size    = text size, screen hight pixel unit.                                //
//          float  xy ratio     = xy ratio of text.                                                  //
//          float2 input coord  = current texture coord.                                             //
//          int    string array = string data in float2 array format, ex: "Demo Text"                //
//              int String0[9] = { __D, __e, __m, __o, __Space, __T, __e, __x, __t};                 //
//          int    string size  = size of the string array.                                          //
//          float  output       = output.                                                            //
//                                                                                                   //
//      DrawText_Digit( offset, text size, xy ratio, input coord, precision after dot, data, output) //
//          float2 offset       = same as DrawText_String.                                           //
//          float  text size    = same as DrawText_String.                                           //
//          float  xy ratio     = same as DrawText_String.                                           //
//          float2 input coord  = same as DrawText_String.                                           //
//          int    precision    = digits after dot.                                                  //
//          float  data         = input float.                                                       //
//          float  output       = output.                                                            //
//                                                                                                   //
//      float2 DrawText_Shift(shift, text size, xy ratio)                                            //
//          float2 shift        = shift line(y) and column.                                          //
//          float text size     = same as DrawText_String.                                           //
//          float xy ratio      = same as DrawText_String.                                           //
//                                                                                                   //
///////////////////////////////////////////////////////////////////////////////////////////////////////


//Sample Usage

/*
float4 main_fragment( float4 position : POSITION,
                      float2 txcoord  : TEXCOORD) : COLOR {
    float res = 0.0;

    int line0[9]  = { __D, __e, __m, __o, __Space, __T, __e, __x, __t };   //Demo Text
    int line1[15] = { __b, __y, __Space, __k, __i, __n, __g, __e, __r, __i, __c, __1, __9, __9, __2 }; //by kingeric1992
    int line2[6]  = { __S, __i, __z, __e, __Colon, __Space }; // Size: %d.

    DrawText_String(float2(100.0 , 100.0), 32, 1, txcoord,  line0, 9, res);
    DrawText_String(float2(100.0 , 134.0), textSize, 1, txcoord,  line1, 15, res);
    DrawText_String(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), 18, 1, txcoord,  line2, 6, res);
    DrawText_Digit(DrawText_Shift(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), int2(8, 0), 18, 1),
                    18, 1, txcoord,  0, textSize, res);

    return res;
}

*/

//Text display
//Character indexing
#define __Space       0 //  (space)
#define __Exclam      1 //  !
#define __Quote       2 //  "
#define __Pound       3 //  #
#define __Dollar      4 //  $
#define __Percent     5 //  %
#define __And         6 //  &
#define __sQuote      7 //  '
#define __rBrac_O     8 //  (
#define __rBrac_C     9 //  )
#define __Asterisk   10 //  *
#define __Plus       11 //  +
#define __Comma      12 //  ,
#define __Minus      13 //  -

#define __Dot        14 //  .
#define __Slash      15 //  /
#define __0          16 //  0
#define __1          17 //  1
#define __2          18 //  2
#define __3          19 //  3
#define __4          20 //  4
#define __5          21 //  5
#define __6          22 //  6
#define __7          23 //  7
#define __8          24 //  8
#define __9          25 //  9
#define __Colon      26 //  :
#define __sColon     27 //  ;

#define __Less       28 //  <
#define __Equals     29 //  =
#define __Greater    30 //  >
#define __Question   31 //  ?
#define __at         32 //  @
#define __A          33 //  A
#define __B          34 //  B
#define __C          35 //  C
#define __D          36 //  D
#define __E          37 //  E
#define __F          38 //  F
#define __G          39 //  G
#define __H          40 //  H
#define __I          41 //  I

#define __J          42 //  J
#define __K          43 //  K
#define __L          44 //  L
#define __M          45 //  M
#define __N          46 //  N
#define __O          47 //  O
#define __P          48 //  P
#define __Q          49 //  Q
#define __R          50 //  R
#define __S          51 //  S
#define __T          52 //  T
#define __U          53 //  U
#define __V          54 //  V
#define __W          55 //  W

#define __X          56 //  X
#define __Y          57 //  Y
#define __Z          58 //  Z
#define __sBrac_O    59 //  [
#define __Backslash  60 //  \..
#define __sBrac_C    61 //  ]
#define __Caret      62 //  ^
#define __Underscore 63 //  _
#define __Punc       64 //  `
#define __a          65 //  a
#define __b          66 //  b
#define __c          67 //  c
#define __d          68 //  d
#define __e          69 //  e

#define __f          70 //  f
#define __g          71 //  g
#define __h          72 //  h
#define __i          73 //  i
#define __j          74 //  j
#define __k          75 //  k
#define __l          76 //  l
#define __m          77 //  m
#define __n          78 //  n
#define __o          79 //  o
#define __p          80 //  p
#define __q          81 //  q
#define __r          82 //  r
#define __s          83 //  s

#define __t          84 //  t
#define __u          85 //  u
#define __v          86 //  v
#define __w          87 //  w
#define __x          88 //  x
#define __y          89 //  y
#define __z          90 //  z
#define __cBrac_O    91 //  {
#define __vBar       92 //  |
#define __cBrac_C    93 //  }
#define __Tilde      94 //  ~
#define __tridot     95 // (...)
#define __empty0     96 // (null)
#define __empty1     97 // (null)
//Character indexing ends

texture Texttex < source = "FontAtlas.png"; > {
    Width  = 512;
    Height = 512;
};

sampler samplerText {
    Texture = Texttex;
};

//accomodate for undef array size.
#define DrawText_String(  pos, size, ratio, tex, array, arrSize, output ) \
    {   float  text = 0.0; \
        float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size; \
        uv.y      = saturate(uv.y); \
        uv.x     *= ratio * 2.0; \
        float  id = array[int(trunc(uv.x))]; \
        if(uv.x  <= arrSize && uv.x >= 0.0) \
            text  = tex2D(samplerText, (frac(uv) + float2( id % 14.0, trunc(id / 14.0))) \
            / float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y) ).x; \
        output += text;  }

float2 DrawText_Shift( float2 pos, int2 shift, float size, float ratio ) {
    return pos + size * shift * float2(0.5, 1.0) / ratio;
}


	float mulTenIntPow(float number,float power){
float sign=(power>=0)?1:-1;
int pwr=uint(round(abs(power)));
[flatten]if(pwr>1){
for(int i=0; i<pwr;i++){
number=(sign==1)?number*10:number/10;
}
}else{
number=(sign==1)?number*10:number/10;
}

return number;
}

float rounder (float places,float number){
float sign=(number>=0)?1:-1;
int integer=int(round(mulTenIntPow(abs(number),places)));

return sign*(mulTenIntPow(float(round(integer)),-places));
}



void DrawText_Digit( float2 pos, float size, float ratio, float2 tex, int digit, float data, inout float4 res,float textGrey) {
    int digits[13] = {
        __0, __1, __2, __3, __4, __5, __6, __7, __8, __9, __Minus, __Space, __Dot
    };

    float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size;
    uv.y      = saturate(uv.y);
    uv.x     *= ratio * 2.0;

data=rounder(digit,data);
    float  t  = abs(data);
    int numDigits = max(ceil(log2(t)/3.32192809),1);

    //early exit:
   if(uv.x <-numDigits-1 || uv.x > digit+1) return;

int index = 0;

[flatten]if(int(uv.x)==0){
index=round(trunc(frac(mulTenIntPow(t,-1))*10));
}else if(int(uv.x)<=-1){
index=round(trunc(frac(trunc(mulTenIntPow(t,uv.x))/10)*10));
}else if(int(uv.x)>=1){
index=round(frac(trunc(mulTenIntPow(t,int(uv.x)))/10)*10);
}

index=(int(uv.x)==0&&int(ceil(uv.x))==1)?12:index;

[flatten]if(int(uv.x)==-numDigits){
if(data>=0){
index=11;
}else{
index=10;
}
}

index=digits[int(index)];

    res  +=(textGrey*2-1)*tex2D(samplerText, (frac(uv) + float2( index % 14.0, trunc(index / 14.0))) /
               float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y)).x;
}

#endif

So the new aforementioned 2D input works when you toggle the 2D input tickbox and you move the mouse to change the current xy values which are printed at the top of the frame. If you click the left mouse button, it will show the output at the xy point specified in the UI and its screen position.

So, move the mouse to find your desired xy co-ordinates and then set the drags in the UI accordingly.

UPDATE: I've just added a new 2D input that lets you put your mouse over a pixel and it will give you the xy co-ordinates necessary to turn that pixel grey.

I've added the option to switch betweeen crosshairs and just a square for the 2D input display. I've also updated the modded DrawText header file.

I've made a new debug and adjustable range (on the screen) for the 2D input. The debug is based on GIMP's max RGB, It's very senstive and still goes close to black when it goes closer to grey.



N.B, I also have a hlsl shader for video in my Github here:
Last Edit: 2 months 57 minutes ago by crabshank. Reason: Modded DrawText header
The administrator has disabled public write access.
The following user(s) said Thank You: MaxG3D, jas01, andrew, Marty, Raughie

White point adjuster 3 months 3 weeks ago #2

I am going to be rewriting all my code to optimise it, this is the first shader for which I have done that and I hope it's better. This code also has new elements in the conversion matrices that should be more accurate.
The administrator has disabled public write access.

White point adjuster 3 months 4 days ago #3

UPDATE:
I have added debug amplification (exaggerates the differences between values close to grey) to non-RGB debug mode as well.
Last Edit: 3 months 4 days ago by crabshank.
The administrator has disabled public write access.
The following user(s) said Thank You: jas01

White point adjuster 3 months 4 days ago #4

For some reason I thought this bar on the left side was some white scale UI you draw with the shader and was like "wait wtf, you shittin me" :P



Much needed effect, a lot of games impose stupid simple color filters and getting rid of them is annoying.
Btw, for your consideration:

XYZ.x = 0.4124564*rgbNew.r + 0.3575761*rgbNew.g + 0.1804375*rgbNew.b;

and

XYZ.x = dot(float3(0.4124564,0.3575761, 0.1804375), rgbNew.rgb)

are same and second one is much faster and iirc also how the matrix muls are implemented. If not, consider converting to dot products as well to speed it up. Not that it matters much for this lightweight filter, but maybe good to know.
Last Edit: 3 months 4 days ago by Marty McFly.
The administrator has disabled public write access.
The following user(s) said Thank You: crabshank

White point adjuster 3 months 3 days ago #5

Updated code ^.

Thanks for that @Marty Mcfly, I checked all my other code for such dot products but I couldn't find any. I decided to keep the muls for readibility and compactness, rather than line after line of dot().

All I need now is a 2D drag UI for the xy points *fingers crossed*.
Last Edit: 3 months 3 days ago by crabshank.
The administrator has disabled public write access.

White point adjuster 2 months 2 weeks ago #6

UPDATE: Added 2D input.

Thanks to BlueSkyDefender and kingeric1992 on Discord for their help.
Last Edit: 2 months 2 weeks ago by crabshank.
The administrator has disabled public write access.
The following user(s) said Thank You: jas01

White point adjuster 2 months 1 week ago #7

UPDATE: Option for a square instead of crosshairs for the 2D input added, and also I've changed my modded DrawText header file (I've also done the same for Grey Gamma and Line Thinning).
The administrator has disabled public write access.

White point adjuster 2 months 5 days ago #8

UPDATE: I've just added a new 2D input that lets you put your mouse over a pixel and it will give you the xy co-ordinates necessary to turn that pixel grey, for easier white balancing.

I've also removed a little bit of bloat from the code.
The administrator has disabled public write access.
The following user(s) said Thank You: jas01

White point adjuster 2 months 2 days ago #9

URGENT UPDATE: Fixed the issues that were giving inaccurate results for the direct point-based input.
The administrator has disabled public write access.