В пиксельном шейдере вы можете передать 256x256 Texture2D с цветами палитры, выстроенными в ряд горизонтально. Тогда ваши текстуры NES будут преобразованы в прямые 3DD текстуры2D с преобразованием каждого пикселя в значение индекса 0-255. Существует формат текстуры, который использует только красное значение в D3D9. Таким образом, текстура будет занимать только 8 бит на пиксель, но данные, поступающие в шейдер, будут иметь значение 0-1.
// Пиксельный шейдер может выглядеть так:
float4 mainPS() : COLOR0
{
float4 colorIndex = tex2D(MainTexture, uv);
float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, 0);
return palletColor;
}
РЕДАКТИРОВАТЬ: более правильным способом было бы добавить во все версии смешиваемых поддонов, которые вам нужно выровнять по текстуре по вертикали, и связать их со значением альфа-значения вашего colorIndex:
float4 mainPS() : COLOR0
{
float4 colorIndex = tex2D(MainTexture, uv);
float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, colorIndex.a);
return palletColor;
}
Третий способ состоит в том, чтобы просто подделать низкокачественное изображение NES, закрасив его альфа-цветом:
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;
}