No sombreador de pixels, você pode passar um Texture2D de 256x256 com as cores do palete alinhadas horizontalmente em uma linha. Em seguida, suas texturas NES seriam convertidas em direct3D Texture2Ds com cada pixel convertido em um valor de índice de 0 a 255. Há um formato de textura que usa apenas o valor vermelho em D3D9. Portanto, a textura ocuparia apenas 8 bits por pixel, mas os dados que entram no shader seriam de 0 a 1.
// O pixel shader pode ficar assim:
float4 mainPS() : COLOR0
{
float4 colorIndex = tex2D(MainTexture, uv);
float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, 0);
return palletColor;
}
EDIT: Uma maneira mais correta seria adicionar todas as versões de paletes de mesclagem que você precisa alinhadas verticalmente na textura e referenciá-las com o valor 'alpha' do seu colorIndex:
float4 mainPS() : COLOR0
{
float4 colorIndex = tex2D(MainTexture, uv);
float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, colorIndex.a);
return palletColor;
}
Uma terceira maneira seria falsificar a baixa qualidade de desbotamento do NES ao sombrear a cor alfa:
float4 mainPS() : COLOR0
{
float4 colorIndex = tex2D(MainTexture, uv);
float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, 0);
palletColor.a = floor(palletColor.a * fadeQuality) / fadeQuality;
//NOTE: If fadeQuality where to equal say '3' there would be only 3 levels of fade.
return palletColor;
}