Так как 256-цветный режим устарел и больше не поддерживается в режиме Direct3D, мне пришла в голову идея использовать вместо этого пиксельный шейдер для имитации палитры NES всех возможных цветов, чтобы объекты с затуханием и тому подобное не имели плавных затуханий с альфа-каналами. , (Я знаю, что объекты не могли действительно исчезать в NES, но у меня есть все объекты, которые появляются и исчезают на сплошном черном фоне, что было бы возможно при смене палитры. Кроме того, экран затухает и исчезает при паузе что, как я знаю, было возможно и при смене палитры, как это было сделано в нескольких играх Mega Man.) Проблема в том, что я почти ничего не знаю о шейдерах HLSL.
Как это сделать?
Ответы:
В пиксельном шейдере вы можете передать 256x256 Texture2D с цветами палитры, выстроенными в ряд горизонтально. Тогда ваши текстуры NES будут преобразованы в прямые 3DD текстуры2D с преобразованием каждого пикселя в значение индекса 0-255. Существует формат текстуры, который использует только красное значение в D3D9. Таким образом, текстура будет занимать только 8 бит на пиксель, но данные, поступающие в шейдер, будут иметь значение 0-1.
// Пиксельный шейдер может выглядеть так:
РЕДАКТИРОВАТЬ: более правильным способом было бы добавить во все версии смешиваемых поддонов, которые вам нужно выровнять по текстуре по вертикали, и связать их со значением альфа-значения вашего colorIndex:
Третий способ состоит в том, чтобы просто подделать низкокачественное изображение NES, закрасив его альфа-цветом:
источник
Если вы на самом деле не заботитесь об использовании текстурной памяти (и идея использовать безумный объем текстурной памяти для получения ретро-стиля имеет своего рода извращенную привлекательность), вы можете создать трехмерную текстуру 256x256x256, отображающую все комбинации RGB в выбранную палитру. , Тогда в вашем шейдере он просто становится одной строкой кода в конце:
Может даже не потребоваться пройти весь путь до 256x256x256 - может быть достаточно что-то вроде 64x64x64 - и вы даже можете изменить отображения палитры на лету, используя этот метод (но при значительных затратах из-за большого динамического обновления текстуры).
источник
(оба моих решения работают, только если вы не заботитесь о смене паллет на лету с помощью шейдеров)
Вы можете использовать любой тип текстуры и просто вычислить шейдер. Хитрость в том, что у вас больше информации о цвете, чем вам нужно, поэтому вы просто избавитесь от информации, которая вам не нужна.
8-битный цвет находится в формате RRRGGGBB . Что дает вам 8 оттенков красного и зеленого и 4 оттенка синего.
Это решение будет работать для любых текстур формата RGB (A).
примечание: я написал это из головы, но я действительно уверен, что он скомпилируется и будет работать для вас
Другая возможность - использовать формат текстуры D3DFMT_R3G3B2 , который на самом деле совпадает с 8-битной графикой. Когда вы помещаете данные в эту текстуру, вы можете использовать простую битовую операцию на байт.
источник