Optimized retro shaders by precomputing deviation

This commit is contained in:
Robert Beckebans 2024-12-23 18:46:47 +01:00
parent 4f876b4bb5
commit 2ae6a7fe86
5 changed files with 504 additions and 795 deletions

View file

@ -1248,6 +1248,41 @@ CONSOLE_COMMAND( makeImageHeader, "load an image and turn it into a .h file", NU
Mem_Free( buffer );
}
class idSortColors : public idSort_Quick< idVec3, idSortColors >
{
public:
int SizeMetric( const idVec3& v ) const
{
return v.x * v.x + v.y * v.y + v.z * v.z;
}
int Compare( const idVec3& a, const idVec3& b ) const
{
//idVec3 diff = b - a;
//return SizeMetric( diff );
return SizeMetric( a ) - SizeMetric( b );
}
};
idVec3 Average( const idList<idVec3>& colors )
{
idVec3 avg = vec3_zero;
int numColors = colors.Num();
for( int i = 0; i < numColors; i++ )
{
avg += colors[i];
}
avg *= ( 1.0f / numColors );
return avg;
}
idVec3 Median( const idList<idVec3>& sortedPal )
{
return sortedPal[sortedPal.Num() / 2];
}
CONSOLE_COMMAND( makePaletteHeader, "load a .pal palette, build an image from it and turn it into a .h file", NULL )
{
if( args.Argc() < 2 )
@ -1280,17 +1315,66 @@ CONSOLE_COMMAND( makePaletteHeader, "load a .pal palette, build an image from it
int numColors = src.ParseInt();
//idList<id
byte rgb[3];
idList<idVec3> colors;
colors.AssureSize( numColors );
idVec3 rgb;
for( int i = 0; i < numColors; i++ )
{
rgb[0] = src.ParseInt();
rgb[1] = src.ParseInt();
rgb[2] = src.ParseInt();
idLib::Printf( "RGB( %d, %d, %d ),\n", rgb[0], rgb[1], rgb[2] );
colors[ i ] = rgb;
//idLib::Printf( "RGB( %d, %d, %d ),\n", (int)rgb[0], (int)rgb[1], (int)rgb[2] );
}
idLib::Printf( "// SORTED ============\n" );
colors.SortWithTemplate( idSortColors() );
idLib::Printf( "const float3 palette[NUM_COLORS] = // %d\n{\n", numColors );
for( int i = 0; i < numColors; i++ )
{
rgb = colors[ i ];
idLib::Printf( "\tRGB( %d, %d, %d ),\n", ( int )rgb[0], ( int )rgb[1], ( int )rgb[2] );
}
idLib::Printf( "};\n\n", numColors );
// calc the median absolute deviation
idVec3 median = Median( colors );
idList<idVec3> deviations;
deviations.AssureSize( numColors );
for( int i = 0; i < numColors; i++ )
{
idVec3 diff = colors[i] - median;
deviations[i].x = idMath::Fabs( diff.x );
deviations[i].y = idMath::Fabs( diff.y );
deviations[i].z = idMath::Fabs( diff.z );
}
deviations.SortWithTemplate( idSortColors() );
rgb = Median( deviations );
idLib::Printf( "const float3 medianAbsoluteDeviation = RGB( %d, %d, %d );\n", ( int )rgb[0], ( int )rgb[1], ( int )rgb[2] );
// calc the standard deviation
idVec3 avg = Average( colors );
idVec3 deviation = vec3_zero;
for( int i = 0; i < numColors; i++ )
{
idVec3 diff = colors[i] - avg;
deviation.x += idMath::Fabs( diff.x );
deviation.y += idMath::Fabs( diff.y );
deviation.z += idMath::Fabs( diff.z );
}
deviation *= ( 1.0f / numColors );
rgb = deviation;
idLib::Printf( "const float3 deviation = RGB( %d, %d, %d );\n", ( int )rgb[0], ( int )rgb[1], ( int )rgb[2] );
fileSystem->FreeFile( palBuffer );
filename.StripFileExtension();

View file

@ -106,73 +106,6 @@ float3 LinearSearch( float3 c, float3 pal[NUM_COLORS] )
return pal[index];
}
/*
float3 GetClosest( float3 val1, float3 val2, float3 target )
{
if( distance( target, val1 ) >= distance( val2, target ) )
{
return val2;
}
else
{
return val1;
}
}
// find nearest palette color using Euclidean disntance and binary search
// this requires an already sorted palette as input
float3 BinarySearch( float3 target, float3 pal[NUM_COLORS] )
{
float targetY = PhotoLuma( target );
// left-side case
if( targetY <= PhotoLuma( pal[0] ) )
{
return pal[0];
}
// right-side case
if( targetY >= PhotoLuma( pal[NUM_COLORS - 1] ) )
{
return pal[NUM_COLORS - 1];
}
int i = 0, j = NUM_COLORS, mid = 0;
while( i < j )
{
mid = ( i + j ) / 2;
if( distance( pal[mid], target ) < 0.01 )
{
return pal[mid];
}
// if target is less than array element, then search in left
if( targetY < PhotoLuma( pal[mid] ) )
{
// if target is greater than previous
// to mid, return closest of two
if( mid > 0 && targetY > PhotoLuma( pal[mid - 1] ) )
{
return GetClosest( pal[mid - 1], pal[mid], target );
}
j = mid;
}
else
{
if( mid < ( NUM_COLORS - 1 ) && targetY < PhotoLuma( pal[mid + 1] ) )
{
return GetClosest( pal[mid], pal[mid + 1], target );
}
i = mid + 1;
}
}
// only single element left after search
return pal[mid];
}
*/
#define RGB(r, g, b) float3(float(r)/255.0, float(g)/255.0, float(b)/255.0)
@ -283,7 +216,6 @@ void main( PS_IN fragment, out PS_OUT result )
// find closest color match from C64 color palette
color = LinearSearch( color.rgb, palette );
//color = float4( BinarySearch( color.rgb, palette ), 1.0 );
result.color = float4( color, 1.0 );
}

View file

@ -240,39 +240,82 @@ void main( PS_IN fragment, out PS_OUT result )
const float3 palette[NUM_COLORS] = // 32
{
RGB( 0, 0, 0 ),
RGB( 36, 49, 55 ),
RGB( 27, 27, 101 ),
RGB( 53, 53, 201 ),
RGB( 102, 30, 37 ),
RGB( 85, 51, 97 ),
RGB( 127, 53, 201 ),
RGB( 188, 53, 53 ),
RGB( 192, 70, 110 ),
RGB( 223, 109, 155 ),
RGB( 27, 101, 27 ),
RGB( 27, 110, 131 ),
RGB( 30, 121, 229 ),
RGB( 102, 30, 37 ),
RGB( 63, 80, 63 ),
RGB( 85, 51, 97 ),
RGB( 121, 95, 27 ),
RGB( 128, 128, 128 ),
RGB( 145, 148, 223 ),
RGB( 201, 127, 53 ),
RGB( 227, 155, 141 ),
RGB( 248, 120, 248 ),
RGB( 27, 110, 131 ),
RGB( 53, 175, 53 ),
RGB( 118, 132, 72 ),
RGB( 188, 53, 53 ),
RGB( 53, 53, 201 ),
RGB( 128, 128, 128 ),
RGB( 192, 70, 110 ),
RGB( 53, 183, 143 ),
RGB( 53, 193, 215 ),
RGB( 127, 201, 53 ),
RGB( 127, 53, 201 ),
RGB( 201, 127, 53 ),
RGB( 30, 121, 229 ),
RGB( 172, 181, 107 ),
RGB( 223, 109, 155 ),
RGB( 53, 193, 215 ),
RGB( 145, 148, 223 ),
RGB( 225, 198, 67 ),
RGB( 227, 155, 141 ),
RGB( 173, 200, 170 ),
RGB( 141, 225, 199 ),
RGB( 225, 198, 67 ),
RGB( 228, 221, 154 ),
RGB( 255, 255, 255 ),
RGB( 248, 120, 248 ),
RGB( 238, 234, 224 ),
RGB( 172, 181, 107 ),
RGB( 118, 132, 72 ),
RGB( 63, 80, 63 ),
RGB( 36, 49, 55 ),
RGB( 255, 255, 255 ),
};
const float3 medianAbsoluteDeviation = RGB( 65, 131, 57 );
const float3 deviation = RGB( 66, 57, 63 );
#elif 1
// https://lospec.com/palette-list/ancientheritage30
const float3 palette[NUM_COLORS] = // 30
{
RGB( 2, 4, 5 ),
RGB( 21, 33, 43 ),
RGB( 51, 38, 20 ),
RGB( 30, 56, 56 ),
RGB( 32, 50, 66 ),
RGB( 77, 59, 34 ),
RGB( 95, 26, 41 ),
RGB( 41, 77, 70 ),
RGB( 97, 31, 73 ),
RGB( 45, 71, 94 ),
RGB( 51, 99, 83 ),
RGB( 125, 69, 52 ),
RGB( 83, 88, 94 ),
RGB( 113, 89, 72 ),
RGB( 146, 40, 62 ),
RGB( 67, 104, 121 ),
RGB( 140, 76, 128 ),
RGB( 175, 107, 66 ),
RGB( 109, 153, 106 ),
RGB( 199, 78, 51 ),
RGB( 122, 129, 140 ),
RGB( 154, 116, 181 ),
RGB( 100, 166, 194 ),
RGB( 240, 120, 62 ),
RGB( 176, 178, 181 ),
RGB( 255, 168, 97 ),
RGB( 171, 157, 227 ),
RGB( 119, 217, 213 ),
RGB( 255, 240, 156 ),
RGB( 233, 241, 242 ),
};
const float3 medianAbsoluteDeviation = RGB( 87, 12, 60 );
const float3 deviation = RGB( 57, 50, 51 );
#elif 0
// Atari STE
@ -354,36 +397,14 @@ void main( PS_IN fragment, out PS_OUT result )
RGB( 46, 43, 18 ),
};
#elif 0
// Hollow
// https://lospec.com/palette-list/hollow
const float3 palette[NUM_COLORS] = // 4
{
RGB( 15, 15, 27 ),
RGB( 86, 90, 117 ),
RGB( 198, 183, 190 ),
RGB( 250, 251, 246 ),
};
#else
// https://lospec.com/palette-list/2bit-demichrome
const float3 palette[NUM_COLORS] = // 4
{
RGB( 33, 30, 32 ),
RGB( 85, 85, 104 ),
RGB( 160, 160, 139 ),
RGB( 233, 239, 236 ),
};
#endif
float2 uv = ( fragment.texcoord0 );
float2 uvPixelated = floor( fragment.position.xy / RESOLUTION_DIVISOR ) * RESOLUTION_DIVISOR;
float3 quantizationPeriod = _float3( 1.0 / NUM_COLORS );
float3 quantDeviation = Deviation( palette );
float3 quantDeviation = deviation; //Deviation( palette );
quantDeviation = medianAbsoluteDeviation;
// get pixellated base color
float4 color = t_BaseColor.Sample( s_LinearClamp, uvPixelated * rpWindowCoord.xy );

View file

@ -54,31 +54,6 @@ struct PS_OUT
#define NUM_COLORS 64 // original 61
float3 Average( float3 pal[NUM_COLORS] )
{
float3 sum = _float3( 0 );
for( int i = 0; i < NUM_COLORS; i++ )
{
sum += pal[i];
}
return sum / float( NUM_COLORS );
}
float3 Deviation( float3 pal[NUM_COLORS] )
{
float3 sum = _float3( 0 );
float3 avg = Average( pal );
for( int i = 0; i < NUM_COLORS; i++ )
{
sum += abs( pal[i] - avg );
}
return sum / float( NUM_COLORS );
}
// squared distance to avoid the sqrt of distance function
float ColorCompare( float3 a, float3 b )
{
@ -111,621 +86,297 @@ float3 LinearSearch( float3 c, float3 pal[NUM_COLORS] )
void main( PS_IN fragment, out PS_OUT result )
{
#if 0
// Ancient Heritage 30
// https://lospec.com/palette-list/ancientheritage30
const float3 palette[NUM_COLORS] = // 30
{
RGB( 2, 4, 5 ),
RGB( 21, 33, 43 ),
RGB( 32, 50, 66 ),
RGB( 45, 71, 94 ),
RGB( 67, 104, 121 ),
RGB( 100, 166, 194 ),
RGB( 119, 217, 213 ),
RGB( 233, 241, 242 ),
RGB( 176, 178, 181 ),
RGB( 122, 129, 140 ),
RGB( 83, 88, 94 ),
RGB( 125, 69, 52 ),
RGB( 175, 107, 66 ),
RGB( 255, 168, 97 ),
RGB( 255, 240, 156 ),
RGB( 95, 26, 41 ),
RGB( 146, 40, 62 ),
RGB( 199, 78, 51 ),
RGB( 240, 120, 62 ),
RGB( 30, 56, 56 ),
RGB( 41, 77, 70 ),
RGB( 51, 99, 83 ),
RGB( 109, 153, 106 ),
RGB( 97, 31, 73 ),
RGB( 140, 76, 128 ),
RGB( 154, 116, 181 ),
RGB( 171, 157, 227 ),
RGB( 51, 38, 20 ),
RGB( 77, 59, 34 ),
RGB( 113, 89, 72 ),
};
#elif 0
// Meld Plus - a Sega candidate, very colorful
// + very colorful
// - no blacks
// - looks more 8 bit than 16 bit
// https://lospec.com/palette-list/meld-plus
const float3 palette[NUM_COLORS] = // 45
{
RGB( 81, 6, 44 ),
RGB( 149, 18, 58 ),
RGB( 189, 101, 55 ),
RGB( 230, 167, 88 ),
RGB( 251, 227, 163 ),
RGB( 255, 255, 255 ),
RGB( 242, 230, 179 ),
RGB( 210, 154, 173 ),
RGB( 131, 97, 144 ),
RGB( 64, 60, 105 ),
RGB( 0, 0, 55 ),
RGB( 64, 47, 93 ),
RGB( 95, 92, 128 ),
RGB( 149, 154, 187 ),
RGB( 209, 234, 251 ),
RGB( 255, 205, 243 ),
RGB( 249, 132, 237 ),
RGB( 194, 42, 218 ),
RGB( 79, 10, 138 ),
RGB( 30, 13, 78 ),
RGB( 19, 33, 120 ),
RGB( 29, 84, 177 ),
RGB( 53, 135, 210 ),
RGB( 97, 212, 255 ),
RGB( 231, 255, 125 ),
RGB( 133, 223, 83 ),
RGB( 33, 165, 63 ),
RGB( 0, 89, 86 ),
RGB( 0, 60, 69 ),
RGB( 4, 182, 146 ),
RGB( 13, 233, 142 ),
RGB( 152, 255, 192 ),
RGB( 255, 231, 160 ),
RGB( 255, 153, 51 ),
RGB( 205, 80, 24 ),
RGB( 135, 14, 87 ),
RGB( 81, 6, 44 ),
RGB( 82, 48, 55 ),
RGB( 76, 2, 91 ),
RGB( 64, 47, 93 ),
RGB( 0, 89, 86 ),
RGB( 19, 33, 120 ),
RGB( 64, 60, 105 ),
RGB( 79, 10, 138 ),
RGB( 149, 18, 58 ),
RGB( 135, 14, 87 ),
RGB( 33, 165, 63 ),
RGB( 95, 92, 128 ),
RGB( 29, 84, 177 ),
RGB( 131, 97, 144 ),
RGB( 189, 101, 55 ),
RGB( 205, 80, 24 ),
RGB( 4, 182, 146 ),
RGB( 156, 130, 119 ),
RGB( 209, 57, 103 ),
RGB( 53, 135, 210 ),
RGB( 133, 223, 83 ),
RGB( 13, 233, 142 ),
RGB( 255, 94, 67 ),
RGB( 149, 154, 187 ),
RGB( 194, 42, 218 ),
RGB( 230, 167, 88 ),
RGB( 255, 130, 87 ),
RGB( 255, 153, 51 ),
RGB( 197, 180, 161 ),
RGB( 210, 154, 173 ),
RGB( 97, 212, 255 ),
RGB( 152, 255, 192 ),
RGB( 231, 255, 125 ),
RGB( 249, 132, 237 ),
RGB( 251, 227, 163 ),
RGB( 242, 230, 179 ),
RGB( 255, 231, 160 ),
RGB( 255, 211, 200 ),
RGB( 247, 236, 206 ),
RGB( 197, 180, 161 ),
RGB( 156, 130, 119 ),
RGB( 82, 48, 55 ),
RGB( 209, 234, 251 ),
RGB( 255, 205, 243 ),
RGB( 255, 255, 255 ),
};
#elif 0
// https://lospec.com/palette-list/nostalgia48
const float3 palette[NUM_COLORS] = // 48
{
RGB( 5, 9, 15 ),
RGB( 36, 55, 87 ),
RGB( 60, 82, 117 ),
RGB( 90, 113, 148 ),
RGB( 127, 146, 179 ),
RGB( 167, 183, 209 ),
RGB( 206, 215, 232 ),
RGB( 235, 238, 249 ),
RGB( 13, 40, 41 ),
RGB( 21, 66, 55 ),
RGB( 35, 92, 68 ),
RGB( 49, 117, 69 ),
RGB( 66, 143, 66 ),
RGB( 110, 168, 74 ),
RGB( 163, 194, 85 ),
RGB( 207, 219, 114 ),
RGB( 117, 22, 35 ),
RGB( 148, 42, 32 ),
RGB( 179, 68, 40 ),
RGB( 209, 102, 48 ),
RGB( 230, 141, 62 ),
RGB( 240, 174, 74 ),
RGB( 240, 201, 85 ),
RGB( 245, 232, 93 ),
RGB( 92, 30, 28 ),
RGB( 120, 54, 42 ),
RGB( 145, 82, 55 ),
RGB( 173, 112, 68 ),
RGB( 199, 140, 88 ),
RGB( 224, 173, 114 ),
RGB( 235, 196, 138 ),
RGB( 245, 217, 166 ),
RGB( 254, 241, 199 ),
RGB( 63, 26, 77 ),
RGB( 109, 41, 117 ),
RGB( 148, 57, 137 ),
RGB( 179, 80, 141 ),
RGB( 204, 107, 138 ),
RGB( 230, 148, 143 ),
RGB( 245, 186, 169 ),
RGB( 34, 27, 82 ),
RGB( 38, 44, 112 ),
RGB( 48, 72, 140 ),
RGB( 58, 114, 171 ),
RGB( 83, 172, 204 ),
RGB( 118, 213, 224 ),
RGB( 167, 232, 231 ),
RGB( 216, 240, 238 ),
};
const float3 medianAbsoluteDeviation = RGB( 29, 87, 155 );
const float3 deviation = RGB( 80, 72, 55 );
#elif 1
// + very good dithering variety at dark grey values
// + does not leak too much color into grey values
// + good saturation when colors are really needed
// - a bit too strong visible dithering pattern
// https://lospec.com/palette-list/famicube
const float3 palette[NUM_COLORS] = // 64
{
RGB( 0, 0, 0 ),
RGB( 224, 60, 40 ),
RGB( 255, 255, 255 ),
RGB( 215, 215, 215 ),
RGB( 168, 168, 168 ),
RGB( 123, 123, 123 ),
RGB( 52, 52, 52 ),
RGB( 21, 21, 21 ),
RGB( 13, 32, 48 ),
RGB( 65, 93, 102 ),
RGB( 113, 166, 161 ),
RGB( 189, 255, 202 ),
RGB( 37, 226, 205 ),
RGB( 10, 152, 172 ),
RGB( 0, 82, 128 ),
RGB( 0, 96, 75 ),
RGB( 32, 181, 98 ),
RGB( 88, 211, 50 ),
RGB( 19, 157, 8 ),
RGB( 0, 78, 0 ),
RGB( 23, 40, 8 ),
RGB( 55, 109, 3 ),
RGB( 106, 180, 23 ),
RGB( 140, 214, 18 ),
RGB( 190, 235, 113 ),
RGB( 238, 255, 169 ),
RGB( 182, 193, 33 ),
RGB( 147, 151, 23 ),
RGB( 204, 143, 21 ),
RGB( 255, 187, 49 ),
RGB( 255, 231, 55 ),
RGB( 246, 143, 55 ),
RGB( 173, 78, 26 ),
RGB( 35, 23, 18 ),
RGB( 92, 60, 13 ),
RGB( 174, 108, 55 ),
RGB( 197, 151, 130 ),
RGB( 226, 215, 181 ),
RGB( 79, 21, 7 ),
RGB( 130, 60, 61 ),
RGB( 218, 101, 94 ),
RGB( 225, 130, 137 ),
RGB( 245, 183, 132 ),
RGB( 255, 233, 197 ),
RGB( 255, 130, 206 ),
RGB( 207, 60, 113 ),
RGB( 135, 22, 70 ),
RGB( 163, 40, 179 ),
RGB( 204, 105, 228 ),
RGB( 213, 156, 252 ),
RGB( 254, 201, 237 ),
RGB( 226, 201, 255 ),
RGB( 166, 117, 254 ),
RGB( 106, 49, 202 ),
RGB( 90, 25, 145 ),
RGB( 23, 40, 8 ),
RGB( 13, 32, 48 ),
RGB( 33, 22, 64 ),
RGB( 61, 52, 165 ),
RGB( 98, 100, 220 ),
RGB( 155, 160, 239 ),
RGB( 152, 220, 255 ),
RGB( 91, 168, 255 ),
RGB( 10, 137, 255 ),
RGB( 2, 74, 202 ),
RGB( 0, 78, 0 ),
RGB( 79, 21, 7 ),
RGB( 52, 52, 52 ),
RGB( 92, 60, 13 ),
RGB( 0, 96, 75 ),
RGB( 55, 109, 3 ),
RGB( 0, 23, 125 ),
};
#elif 1
// https://lospec.com/palette-list/blk-nx64
const float3 palette[NUM_COLORS] = // 64
{
RGB( 0, 0, 0 ),
RGB( 18, 23, 61 ),
RGB( 41, 50, 104 ),
RGB( 70, 75, 140 ),
RGB( 107, 116, 178 ),
RGB( 144, 158, 221 ),
RGB( 193, 217, 242 ),
RGB( 0, 82, 128 ),
RGB( 65, 93, 102 ),
RGB( 135, 22, 70 ),
RGB( 130, 60, 61 ),
RGB( 19, 157, 8 ),
RGB( 90, 25, 145 ),
RGB( 61, 52, 165 ),
RGB( 173, 78, 26 ),
RGB( 32, 181, 98 ),
RGB( 106, 180, 23 ),
RGB( 147, 151, 23 ),
RGB( 174, 108, 55 ),
RGB( 123, 123, 123 ),
RGB( 2, 74, 202 ),
RGB( 10, 152, 172 ),
RGB( 106, 49, 202 ),
RGB( 88, 211, 50 ),
RGB( 224, 60, 40 ),
RGB( 207, 60, 113 ),
RGB( 163, 40, 179 ),
RGB( 204, 143, 21 ),
RGB( 140, 214, 18 ),
RGB( 113, 166, 161 ),
RGB( 218, 101, 94 ),
RGB( 98, 100, 220 ),
RGB( 182, 193, 33 ),
RGB( 197, 151, 130 ),
RGB( 10, 137, 255 ),
RGB( 246, 143, 55 ),
RGB( 168, 168, 168 ),
RGB( 225, 130, 137 ),
RGB( 37, 226, 205 ),
RGB( 91, 168, 255 ),
RGB( 255, 187, 49 ),
RGB( 190, 235, 113 ),
RGB( 204, 105, 228 ),
RGB( 166, 117, 254 ),
RGB( 155, 160, 239 ),
RGB( 245, 183, 132 ),
RGB( 255, 231, 55 ),
RGB( 255, 130, 206 ),
RGB( 226, 215, 181 ),
RGB( 213, 156, 252 ),
RGB( 152, 220, 255 ),
RGB( 215, 215, 215 ),
RGB( 189, 255, 202 ),
RGB( 238, 255, 169 ),
RGB( 226, 201, 255 ),
RGB( 255, 233, 197 ),
RGB( 254, 201, 237 ),
RGB( 255, 255, 255 ),
RGB( 162, 147, 196 ),
RGB( 123, 106, 165 ),
RGB( 83, 66, 127 ),
RGB( 60, 44, 104 ),
RGB( 67, 30, 102 ),
RGB( 93, 47, 140 ),
RGB( 133, 76, 191 ),
RGB( 180, 131, 239 ),
RGB( 140, 255, 155 ),
RGB( 66, 188, 127 ),
RGB( 34, 137, 110 ),
RGB( 20, 102, 91 ),
RGB( 15, 74, 76 ),
RGB( 10, 42, 51 ),
RGB( 29, 26, 89 ),
RGB( 50, 45, 137 ),
RGB( 53, 74, 178 ),
RGB( 62, 131, 209 ),
RGB( 80, 185, 235 ),
RGB( 140, 218, 255 ),
RGB( 83, 161, 173 ),
RGB( 59, 118, 143 ),
RGB( 33, 82, 107 ),
RGB( 22, 55, 85 ),
RGB( 0, 135, 130 ),
RGB( 0, 170, 165 ),
RGB( 39, 211, 203 ),
RGB( 120, 250, 230 ),
RGB( 205, 197, 153 ),
RGB( 152, 143, 100 ),
RGB( 92, 93, 65 ),
RGB( 53, 63, 35 ),
RGB( 145, 155, 69 ),
RGB( 175, 211, 112 ),
RGB( 255, 224, 145 ),
RGB( 255, 170, 110 ),
RGB( 255, 105, 90 ),
RGB( 178, 60, 64 ),
RGB( 255, 102, 117 ),
RGB( 221, 55, 69 ),
RGB( 165, 38, 57 ),
RGB( 114, 28, 47 ),
RGB( 178, 46, 105 ),
RGB( 229, 66, 134 ),
RGB( 255, 110, 175 ),
RGB( 255, 165, 213 ),
RGB( 255, 211, 173 ),
RGB( 204, 129, 122 ),
RGB( 137, 86, 84 ),
RGB( 97, 57, 59 ),
RGB( 63, 31, 60 ),
RGB( 114, 51, 82 ),
RGB( 153, 76, 105 ),
RGB( 195, 114, 137 ),
RGB( 242, 159, 170 ),
RGB( 255, 204, 208 ),
};
const float3 medianAbsoluteDeviation = RGB( 63, 175, 2 );
const float3 deviation = RGB( 76, 62, 75 );
#elif 0
// Resurrect 64 - Most popular 64 colors palette
// - leaks too much color into grey scale bar
// - dark greys are just dark purple
// https://lospec.com/palette-list/resurrect-64
const float3 palette[NUM_COLORS] = // 64
{
RGB( 46, 34, 47 ),
RGB( 62, 53, 70 ),
RGB( 98, 85, 101 ),
RGB( 150, 108, 108 ),
RGB( 171, 148, 122 ),
RGB( 105, 79, 98 ),
RGB( 127, 112, 138 ),
RGB( 155, 171, 178 ),
RGB( 199, 220, 208 ),
RGB( 255, 255, 255 ),
RGB( 110, 39, 39 ),
RGB( 179, 56, 49 ),
RGB( 234, 79, 54 ),
RGB( 245, 125, 74 ),
RGB( 174, 35, 52 ),
RGB( 232, 59, 59 ),
RGB( 251, 107, 29 ),
RGB( 247, 150, 23 ),
RGB( 249, 194, 43 ),
RGB( 122, 48, 69 ),
RGB( 158, 69, 57 ),
RGB( 205, 104, 61 ),
RGB( 230, 144, 78 ),
RGB( 251, 185, 84 ),
RGB( 76, 62, 36 ),
RGB( 103, 102, 51 ),
RGB( 162, 169, 71 ),
RGB( 213, 224, 75 ),
RGB( 251, 255, 134 ),
RGB( 22, 90, 76 ),
RGB( 35, 144, 99 ),
RGB( 30, 188, 115 ),
RGB( 145, 219, 105 ),
RGB( 205, 223, 108 ),
RGB( 49, 54, 56 ),
RGB( 55, 78, 74 ),
RGB( 84, 126, 100 ),
RGB( 146, 169, 132 ),
RGB( 178, 186, 144 ),
RGB( 11, 94, 101 ),
RGB( 11, 138, 143 ),
RGB( 14, 175, 155 ),
RGB( 48, 225, 185 ),
RGB( 143, 248, 226 ),
RGB( 50, 51, 83 ),
RGB( 72, 74, 119 ),
RGB( 77, 101, 180 ),
RGB( 77, 155, 230 ),
RGB( 143, 211, 255 ),
RGB( 69, 41, 63 ),
RGB( 107, 62, 117 ),
RGB( 144, 94, 169 ),
RGB( 168, 132, 243 ),
RGB( 234, 173, 237 ),
RGB( 76, 62, 36 ),
RGB( 62, 53, 70 ),
RGB( 50, 51, 83 ),
RGB( 22, 90, 76 ),
RGB( 55, 78, 74 ),
RGB( 110, 39, 39 ),
RGB( 11, 94, 101 ),
RGB( 122, 48, 69 ),
RGB( 103, 102, 51 ),
RGB( 117, 60, 84 ),
RGB( 162, 75, 111 ),
RGB( 207, 101, 127 ),
RGB( 237, 128, 153 ),
RGB( 72, 74, 119 ),
RGB( 131, 28, 93 ),
RGB( 105, 79, 98 ),
RGB( 98, 85, 101 ),
RGB( 107, 62, 117 ),
RGB( 35, 144, 99 ),
RGB( 84, 126, 100 ),
RGB( 158, 69, 57 ),
RGB( 174, 35, 52 ),
RGB( 179, 56, 49 ),
RGB( 11, 138, 143 ),
RGB( 162, 75, 111 ),
RGB( 150, 108, 108 ),
RGB( 195, 36, 84 ),
RGB( 127, 112, 138 ),
RGB( 77, 101, 180 ),
RGB( 30, 188, 115 ),
RGB( 14, 175, 155 ),
RGB( 205, 104, 61 ),
RGB( 144, 94, 169 ),
RGB( 162, 169, 71 ),
RGB( 232, 59, 59 ),
RGB( 234, 79, 54 ),
RGB( 171, 148, 122 ),
RGB( 146, 169, 132 ),
RGB( 207, 101, 127 ),
RGB( 251, 107, 29 ),
RGB( 240, 79, 120 ),
RGB( 230, 144, 78 ),
RGB( 145, 219, 105 ),
RGB( 245, 125, 74 ),
RGB( 77, 155, 230 ),
RGB( 247, 150, 23 ),
RGB( 155, 171, 178 ),
RGB( 178, 186, 144 ),
RGB( 48, 225, 185 ),
RGB( 246, 129, 129 ),
RGB( 237, 128, 153 ),
RGB( 213, 224, 75 ),
RGB( 249, 194, 43 ),
RGB( 205, 223, 108 ),
RGB( 251, 185, 84 ),
RGB( 168, 132, 243 ),
RGB( 252, 167, 144 ),
RGB( 143, 211, 255 ),
RGB( 199, 220, 208 ),
RGB( 143, 248, 226 ),
RGB( 253, 203, 176 ),
};
#elif 1
// https://lospec.com/palette-list/twilioquest-76
const float3 palette[NUM_COLORS] = // 76
{
RGB( 234, 173, 237 ),
RGB( 251, 255, 134 ),
RGB( 255, 255, 255 ),
RGB( 234, 234, 232 ),
RGB( 206, 202, 201 ),
RGB( 171, 175, 185 ),
RGB( 161, 136, 151 ),
RGB( 117, 98, 118 ),
RGB( 93, 70, 96 ),
RGB( 76, 50, 80 ),
RGB( 67, 38, 65 ),
RGB( 40, 25, 47 ),
RGB( 251, 117, 117 ),
RGB( 251, 59, 100 ),
RGB( 200, 49, 87 ),
RGB( 142, 55, 92 ),
RGB( 79, 35, 81 ),
RGB( 53, 21, 68 ),
RGB( 247, 74, 83 ),
RGB( 242, 47, 70 ),
RGB( 188, 22, 66 ),
RGB( 252, 197, 57 ),
RGB( 248, 123, 27 ),
RGB( 248, 64, 27 ),
RGB( 189, 39, 9 ),
RGB( 124, 18, 43 ),
RGB( 255, 224, 139 ),
RGB( 250, 192, 90 ),
RGB( 235, 143, 72 ),
RGB( 209, 116, 65 ),
RGB( 199, 82, 57 ),
RGB( 177, 41, 53 ),
RGB( 253, 189, 143 ),
RGB( 240, 136, 107 ),
RGB( 211, 104, 83 ),
RGB( 174, 69, 74 ),
RGB( 140, 49, 50 ),
RGB( 84, 35, 35 ),
RGB( 168, 88, 72 ),
RGB( 131, 64, 76 ),
RGB( 103, 49, 75 ),
RGB( 63, 35, 35 ),
RGB( 212, 149, 119 ),
RGB( 159, 112, 90 ),
RGB( 132, 87, 80 ),
RGB( 99, 59, 63 ),
RGB( 123, 215, 169 ),
RGB( 82, 178, 129 ),
RGB( 20, 133, 104 ),
RGB( 20, 103, 86 ),
RGB( 34, 71, 76 ),
RGB( 16, 47, 52 ),
RGB( 235, 255, 139 ),
RGB( 179, 227, 99 ),
RGB( 76, 189, 86 ),
RGB( 47, 135, 53 ),
RGB( 11, 89, 49 ),
RGB( 151, 191, 110 ),
RGB( 137, 159, 102 ),
RGB( 97, 133, 90 ),
RGB( 76, 96, 81 ),
RGB( 115, 223, 242 ),
RGB( 42, 187, 208 ),
RGB( 49, 93, 205 ),
RGB( 71, 42, 156 ),
RGB( 160, 216, 215 ),
RGB( 125, 190, 250 ),
RGB( 102, 143, 175 ),
RGB( 88, 93, 129 ),
RGB( 69, 54, 93 ),
RGB( 246, 186, 254 ),
RGB( 213, 159, 244 ),
RGB( 176, 112, 235 ),
RGB( 124, 60, 225 ),
RGB( 219, 207, 177 ),
RGB( 169, 164, 141 ),
RGB( 123, 131, 130 ),
RGB( 95, 95, 110 ),
};
const float3 medianAbsoluteDeviation = RGB( 94, 43, 86 );
const float3 deviation = RGB( 64, 54, 46 );
#elif 0
// Endesga 64 - very colorful and more complete
// Endesga 64
// + great dithering in the grey scale bar
// - makes the game look too grey
// https://lospec.com/palette-list/endesga-64
const float3 palette[NUM_COLORS] = // 64
{
RGB( 255, 0, 64 ),
RGB( 19, 19, 19 ),
RGB( 27, 27, 27 ),
RGB( 39, 39, 39 ),
RGB( 61, 61, 61 ),
RGB( 93, 93, 93 ),
RGB( 133, 133, 133 ),
RGB( 180, 180, 180 ),
RGB( 255, 255, 255 ),
RGB( 199, 207, 221 ),
RGB( 146, 161, 185 ),
RGB( 101, 115, 146 ),
RGB( 66, 76, 110 ),
RGB( 42, 47, 78 ),
RGB( 26, 25, 50 ),
RGB( 14, 7, 27 ),
RGB( 19, 19, 19 ),
RGB( 28, 18, 28 ),
RGB( 57, 31, 33 ),
RGB( 93, 44, 40 ),
RGB( 138, 72, 54 ),
RGB( 191, 111, 74 ),
RGB( 230, 156, 105 ),
RGB( 246, 202, 159 ),
RGB( 249, 230, 207 ),
RGB( 237, 171, 80 ),
RGB( 224, 116, 56 ),
RGB( 198, 69, 36 ),
RGB( 142, 37, 29 ),
RGB( 255, 80, 0 ),
RGB( 237, 118, 20 ),
RGB( 255, 162, 20 ),
RGB( 255, 200, 37 ),
RGB( 255, 235, 87 ),
RGB( 211, 252, 126 ),
RGB( 153, 230, 95 ),
RGB( 90, 197, 79 ),
RGB( 51, 152, 75 ),
RGB( 30, 111, 80 ),
RGB( 19, 76, 76 ),
RGB( 12, 46, 68 ),
RGB( 0, 57, 109 ),
RGB( 0, 105, 170 ),
RGB( 0, 152, 220 ),
RGB( 0, 205, 249 ),
RGB( 12, 241, 255 ),
RGB( 148, 253, 255 ),
RGB( 253, 210, 237 ),
RGB( 243, 137, 245 ),
RGB( 219, 63, 253 ),
RGB( 122, 9, 250 ),
RGB( 48, 3, 217 ),
RGB( 12, 2, 147 ),
RGB( 27, 27, 27 ),
RGB( 26, 25, 50 ),
RGB( 39, 39, 39 ),
RGB( 3, 25, 63 ),
RGB( 57, 31, 33 ),
RGB( 12, 46, 68 ),
RGB( 59, 20, 67 ),
RGB( 98, 36, 97 ),
RGB( 147, 56, 143 ),
RGB( 202, 82, 201 ),
RGB( 200, 80, 134 ),
RGB( 246, 129, 135 ),
RGB( 245, 85, 93 ),
RGB( 234, 50, 60 ),
RGB( 196, 36, 48 ),
RGB( 137, 30, 43 ),
RGB( 87, 28, 39 ),
};
#elif 0
// like the Sega Master System
// https://lospec.com/palette-list/6-bit-rgb
const float3 palette[NUM_COLORS] = // 64
{
RGB( 0, 0, 0 ),
RGB( 0, 0, 85 ),
RGB( 0, 0, 170 ),
RGB( 0, 0, 255 ),
RGB( 85, 0, 0 ),
RGB( 85, 0, 85 ),
RGB( 85, 0, 170 ),
RGB( 85, 0, 255 ),
RGB( 170, 0, 0 ),
RGB( 170, 0, 85 ),
RGB( 170, 0, 170 ),
RGB( 170, 0, 255 ),
RGB( 255, 0, 0 ),
RGB( 255, 0, 85 ),
RGB( 255, 0, 170 ),
RGB( 255, 0, 255 ),
RGB( 0, 85, 0 ),
RGB( 0, 85, 85 ),
RGB( 0, 85, 170 ),
RGB( 0, 85, 255 ),
RGB( 85, 85, 0 ),
RGB( 85, 85, 85 ),
RGB( 85, 85, 170 ),
RGB( 85, 85, 255 ),
RGB( 170, 85, 0 ),
RGB( 170, 85, 85 ),
RGB( 170, 85, 170 ),
RGB( 170, 85, 255 ),
RGB( 255, 85, 0 ),
RGB( 255, 85, 85 ),
RGB( 255, 85, 170 ),
RGB( 255, 85, 255 ),
RGB( 0, 170, 0 ),
RGB( 0, 170, 85 ),
RGB( 0, 170, 170 ),
RGB( 0, 170, 255 ),
RGB( 85, 170, 0 ),
RGB( 85, 170, 85 ),
RGB( 85, 170, 170 ),
RGB( 85, 170, 255 ),
RGB( 170, 170, 0 ),
RGB( 170, 170, 85 ),
RGB( 170, 170, 170 ),
RGB( 170, 170, 255 ),
RGB( 255, 170, 0 ),
RGB( 255, 170, 85 ),
RGB( 255, 170, 170 ),
RGB( 255, 170, 255 ),
RGB( 0, 255, 0 ),
RGB( 0, 255, 85 ),
RGB( 0, 255, 170 ),
RGB( 0, 255, 255 ),
RGB( 85, 255, 0 ),
RGB( 85, 255, 85 ),
RGB( 85, 255, 170 ),
RGB( 85, 255, 255 ),
RGB( 170, 255, 0 ),
RGB( 170, 255, 85 ),
RGB( 170, 255, 170 ),
RGB( 170, 255, 255 ),
RGB( 255, 255, 0 ),
RGB( 255, 255, 85 ),
RGB( 255, 255, 170 ),
RGB( 42, 47, 78 ),
RGB( 61, 61, 61 ),
RGB( 19, 76, 76 ),
RGB( 93, 44, 40 ),
RGB( 0, 57, 109 ),
RGB( 30, 111, 80 ),
RGB( 98, 36, 97 ),
RGB( 137, 30, 43 ),
RGB( 12, 2, 147 ),
RGB( 66, 76, 110 ),
RGB( 142, 37, 29 ),
RGB( 93, 93, 93 ),
RGB( 138, 72, 54 ),
RGB( 51, 152, 75 ),
RGB( 0, 105, 170 ),
RGB( 196, 36, 48 ),
RGB( 101, 115, 146 ),
RGB( 147, 56, 143 ),
RGB( 198, 69, 36 ),
RGB( 48, 3, 217 ),
RGB( 133, 133, 133 ),
RGB( 90, 197, 79 ),
RGB( 191, 111, 74 ),
RGB( 234, 50, 60 ),
RGB( 200, 80, 134 ),
RGB( 224, 116, 56 ),
RGB( 255, 0, 64 ),
RGB( 237, 118, 20 ),
RGB( 255, 80, 0 ),
RGB( 0, 152, 220 ),
RGB( 245, 85, 93 ),
RGB( 122, 9, 250 ),
RGB( 146, 161, 185 ),
RGB( 153, 230, 95 ),
RGB( 202, 82, 201 ),
RGB( 230, 156, 105 ),
RGB( 255, 162, 20 ),
RGB( 237, 171, 80 ),
RGB( 246, 129, 135 ),
RGB( 180, 180, 180 ),
RGB( 0, 205, 249 ),
RGB( 255, 200, 37 ),
RGB( 219, 63, 253 ),
RGB( 12, 241, 255 ),
RGB( 211, 252, 126 ),
RGB( 246, 202, 159 ),
RGB( 255, 235, 87 ),
RGB( 199, 207, 221 ),
RGB( 243, 137, 245 ),
RGB( 148, 253, 255 ),
RGB( 249, 230, 207 ),
RGB( 253, 210, 237 ),
RGB( 255, 255, 255 ),
};
#elif 0
// Sega Genesis Evangelion
// https://lospec.com/palette-list/sega-genesis-evangelion
const float3 palette[NUM_COLORS] = // 17
{
RGB( 207, 201, 179 ),
RGB( 163, 180, 158 ),
RGB( 100, 166, 174 ),
RGB( 101, 112, 141 ),
RGB( 52, 54, 36 ),
RGB( 37, 34, 70 ),
RGB( 39, 28, 21 ),
RGB( 20, 14, 11 ),
RGB( 0, 0, 0 ),
RGB( 202, 168, 87 ),
RGB( 190, 136, 51 ),
RGB( 171, 85, 92 ),
RGB( 186, 47, 74 ),
RGB( 131, 25, 97 ),
RGB( 102, 52, 143 ),
RGB( 203, 216, 246 ),
RGB( 140, 197, 79 ),
};
const float3 medianAbsoluteDeviation = RGB( 33, 166, 46 );
const float3 deviation = RGB( 82, 65, 64 );
#endif
@ -733,7 +384,8 @@ void main( PS_IN fragment, out PS_OUT result )
float2 uvPixelated = floor( fragment.position.xy / RESOLUTION_DIVISOR ) * RESOLUTION_DIVISOR;
float3 quantizationPeriod = _float3( 1.0 / NUM_COLORS );
float3 quantDeviation = Deviation( palette );
float3 quantDeviation = deviation;
//quantDeviation = medianAbsoluteDeviation;
// get pixellated base color
float3 color = t_BaseColor.Sample( s_LinearClamp, uvPixelated * rpWindowCoord.xy ).rgb;

View file

@ -79,6 +79,19 @@ float3 Deviation( float3 pal[NUM_COLORS] )
return sum / float( NUM_COLORS );
}
float3 StandardDeviation( float3 pal[NUM_COLORS] )
{
float3 sum = _float3( 0 );
float3 avg = Average( pal );
for( int i = 0; i < NUM_COLORS; i++ )
{
sum += pow( pal[i] - avg, 2.0 );
}
return sqrt( sum );
}
// squared distance to avoid the sqrt of distance function
float ColorCompare( float3 a, float3 b )
{
@ -119,62 +132,65 @@ void main( PS_IN fragment, out PS_OUT result )
const float3 palette[NUM_COLORS] = // 55
{
RGB( 0, 0, 0 ),
RGB( 252, 252, 252 ),
RGB( 248, 248, 248 ),
RGB( 188, 188, 188 ),
RGB( 124, 124, 124 ),
RGB( 164, 228, 252 ),
RGB( 60, 188, 252 ),
RGB( 0, 120, 248 ),
RGB( 0, 0, 252 ),
RGB( 184, 184, 248 ),
RGB( 104, 136, 252 ),
RGB( 0, 88, 248 ),
RGB( 0, 0, 188 ),
RGB( 216, 184, 248 ),
RGB( 152, 120, 248 ),
RGB( 104, 68, 252 ),
RGB( 68, 40, 188 ),
RGB( 248, 184, 248 ),
RGB( 248, 120, 248 ),
RGB( 216, 0, 204 ),
RGB( 148, 0, 132 ),
RGB( 248, 164, 192 ),
RGB( 248, 88, 152 ),
RGB( 228, 0, 88 ),
RGB( 168, 0, 32 ),
RGB( 240, 208, 176 ),
RGB( 248, 120, 88 ),
RGB( 248, 56, 0 ),
RGB( 168, 16, 0 ),
RGB( 252, 224, 168 ),
RGB( 252, 160, 68 ),
RGB( 228, 92, 16 ),
RGB( 136, 20, 0 ),
RGB( 248, 216, 120 ),
RGB( 248, 184, 0 ),
RGB( 172, 124, 0 ),
RGB( 80, 48, 0 ),
RGB( 216, 248, 120 ),
RGB( 184, 248, 24 ),
RGB( 0, 184, 0 ),
RGB( 0, 120, 0 ),
RGB( 184, 248, 184 ),
RGB( 88, 216, 84 ),
RGB( 0, 168, 0 ),
RGB( 0, 104, 0 ),
RGB( 184, 248, 216 ),
RGB( 88, 248, 152 ),
RGB( 0, 168, 68 ),
RGB( 0, 88, 0 ),
RGB( 0, 252, 252 ),
RGB( 0, 232, 216 ),
RGB( 0, 136, 136 ),
RGB( 80, 48, 0 ),
RGB( 0, 104, 0 ),
RGB( 0, 64, 88 ),
RGB( 248, 216, 248 ),
RGB( 0, 120, 0 ),
RGB( 136, 20, 0 ),
RGB( 0, 168, 0 ),
RGB( 168, 16, 0 ),
RGB( 168, 0, 32 ),
RGB( 0, 168, 68 ),
RGB( 0, 184, 0 ),
RGB( 0, 0, 188 ),
RGB( 0, 136, 136 ),
RGB( 148, 0, 132 ),
RGB( 68, 40, 188 ),
RGB( 120, 120, 120 ),
RGB( 172, 124, 0 ),
RGB( 124, 124, 124 ),
RGB( 228, 0, 88 ),
RGB( 228, 92, 16 ),
RGB( 88, 216, 84 ),
RGB( 0, 0, 252 ),
RGB( 248, 56, 0 ),
RGB( 0, 88, 248 ),
RGB( 0, 120, 248 ),
RGB( 104, 68, 252 ),
RGB( 248, 120, 88 ),
RGB( 216, 0, 204 ),
RGB( 88, 248, 152 ),
RGB( 248, 88, 152 ),
RGB( 104, 136, 252 ),
RGB( 252, 160, 68 ),
RGB( 248, 184, 0 ),
RGB( 184, 248, 24 ),
RGB( 152, 120, 248 ),
RGB( 0, 232, 216 ),
RGB( 60, 188, 252 ),
RGB( 188, 188, 188 ),
RGB( 216, 248, 120 ),
RGB( 248, 216, 120 ),
RGB( 248, 164, 192 ),
RGB( 0, 252, 252 ),
RGB( 184, 248, 184 ),
RGB( 184, 184, 248 ),
RGB( 240, 208, 176 ),
RGB( 248, 120, 248 ),
RGB( 252, 224, 168 ),
RGB( 216, 184, 248 ),
RGB( 184, 248, 216 ),
RGB( 164, 228, 252 ),
RGB( 248, 184, 248 ),
RGB( 248, 216, 248 ),
RGB( 248, 248, 248 ),
RGB( 252, 252, 252 ),
};
const float3 medianAbsoluteDeviation = RGB( 96, 0, 160 );
const float3 deviation = RGB( 87, 70, 86 );
#else
// NES Advanced
@ -183,69 +199,73 @@ void main( PS_IN fragment, out PS_OUT result )
const float3 palette[NUM_COLORS] = // 55
{
RGB( 0, 0, 0 ),
RGB( 38, 35, 47 ),
RGB( 49, 64, 71 ),
RGB( 89, 109, 98 ),
RGB( 146, 156, 116 ),
RGB( 200, 197, 163 ),
RGB( 252, 252, 252 ),
RGB( 27, 55, 127 ),
RGB( 20, 122, 191 ),
RGB( 64, 175, 221 ),
RGB( 178, 219, 244 ),
RGB( 24, 22, 103 ),
RGB( 59, 44, 150 ),
RGB( 112, 106, 225 ),
RGB( 143, 149, 238 ),
RGB( 68, 10, 65 ),
RGB( 129, 37, 147 ),
RGB( 204, 75, 185 ),
RGB( 236, 153, 219 ),
RGB( 63, 0, 17 ),
RGB( 179, 28, 53 ),
RGB( 239, 32, 100 ),
RGB( 242, 98, 130 ),
RGB( 150, 8, 17 ),
RGB( 232, 24, 19 ),
RGB( 167, 93, 105 ),
RGB( 236, 158, 164 ),
RGB( 86, 13, 4 ),
RGB( 196, 54, 17 ),
RGB( 226, 106, 18 ),
RGB( 240, 175, 102 ),
RGB( 42, 26, 20 ),
RGB( 93, 52, 42 ),
RGB( 166, 110, 70 ),
RGB( 223, 156, 110 ),
RGB( 142, 78, 17 ),
RGB( 216, 149, 17 ),
RGB( 234, 209, 30 ),
RGB( 245, 235, 107 ),
RGB( 47, 84, 28 ),
RGB( 90, 131, 27 ),
RGB( 162, 187, 30 ),
RGB( 198, 223, 107 ),
RGB( 15, 69, 15 ),
RGB( 0, 139, 18 ),
RGB( 11, 203, 18 ),
RGB( 62, 243, 63 ),
RGB( 17, 81, 83 ),
RGB( 12, 133, 99 ),
RGB( 4, 191, 121 ),
RGB( 106, 230, 170 ),
RGB( 63, 0, 17 ),
RGB( 38, 39, 38 ),
RGB( 38, 35, 47 ),
RGB( 15, 69, 15 ),
RGB( 86, 13, 4 ),
RGB( 68, 10, 65 ),
RGB( 47, 84, 28 ),
RGB( 49, 64, 71 ),
RGB( 24, 22, 103 ),
RGB( 93, 52, 42 ),
RGB( 17, 81, 83 ),
RGB( 81, 79, 76 ),
RGB( 0, 139, 18 ),
RGB( 27, 55, 127 ),
RGB( 150, 8, 17 ),
RGB( 90, 131, 27 ),
RGB( 142, 78, 17 ),
RGB( 12, 133, 99 ),
RGB( 59, 44, 150 ),
RGB( 89, 109, 98 ),
RGB( 179, 28, 53 ),
RGB( 129, 37, 147 ),
RGB( 196, 54, 17 ),
RGB( 11, 203, 18 ),
RGB( 166, 110, 70 ),
RGB( 167, 93, 105 ),
RGB( 4, 191, 121 ),
RGB( 136, 126, 131 ),
RGB( 20, 122, 191 ),
RGB( 232, 24, 19 ),
RGB( 146, 156, 116 ),
RGB( 162, 187, 30 ),
RGB( 226, 106, 18 ),
RGB( 62, 243, 63 ),
RGB( 239, 32, 100 ),
RGB( 216, 149, 17 ),
RGB( 112, 106, 225 ),
RGB( 204, 75, 185 ),
RGB( 64, 175, 221 ),
RGB( 242, 98, 130 ),
RGB( 223, 156, 110 ),
RGB( 106, 230, 170 ),
RGB( 179, 170, 192 ),
RGB( 240, 175, 102 ),
RGB( 143, 149, 238 ),
RGB( 234, 209, 30 ),
RGB( 198, 223, 107 ),
RGB( 200, 197, 163 ),
RGB( 236, 158, 164 ),
RGB( 245, 235, 107 ),
RGB( 236, 153, 219 ),
RGB( 178, 219, 244 ),
RGB( 252, 252, 252 ),
};
const float3 medianAbsoluteDeviation = RGB( 55, 13, 120 );
const float3 deviation = RGB( 73, 61, 60 );
#endif
float2 uv = ( fragment.texcoord0 );
float2 uvPixelated = floor( fragment.position.xy / RESOLUTION_DIVISOR ) * RESOLUTION_DIVISOR;
float3 quantizationPeriod = _float3( 1.0 / NUM_COLORS );
float3 quantDeviation = Deviation( palette );
float3 quantDeviation = deviation;// = Deviation( palette );
//quantDeviation = medianAbsoluteDeviation;
// get pixellated base color
float3 color = t_BaseColor.Sample( s_LinearClamp, uvPixelated * rpWindowCoord.xy ).rgb;