#include "Macros.fxh" #define FLT_MAX 3.402823466e+38 DECLARE_TEXTURE(Texture, 0); DECLARE_TEXTURE(Palette, 1); BEGIN_CONSTANTS int PaletteWidth _ps(c0) _cb(c0); END_CONSTANTS struct VertexInput { float4 Position : POSITION; float2 TexCoord : TEXCOORD; }; struct PixelInput { float4 Position : SV_POSITION; float2 TexCoord : TEXCOORD0; }; PixelInput main_vs(VertexInput input) { PixelInput output; output.Position = input.Position; output.TexCoord = input.TexCoord; return output; } float4 main_ps(PixelInput input) : SV_TARGET0 { float4 sampled = SAMPLE_TEXTURE(Texture, input.TexCoord); float3 sampled_color = sampled.rgb; float3 closest_color = float3(0, 0, 0); float closest_dist = FLT_MAX; for (int i = 0; i < PaletteWidth; i++) { float3 palette_color = SAMPLE_TEXTURE(Palette, float2(i / (float)PaletteWidth, 0)); float dist = distance(palette_color, sampled_color); if (dist < closest_dist) { closest_dist = dist; closest_color = palette_color; } } return float4(closest_color, sampled.a); } Technique PaletteCrush { Pass { VertexShader = compile vs_3_0 main_vs(); PixelShader = compile ps_3_0 main_ps(); } }