Быстрый палитра экрана с Direct3D 9
Игра использует программный рендеринг для рисования полноэкранного палитрового (8-битного) изображения в памяти.
Какой самый быстрый способ вывести это изображение на экран, используя Direct3D?
В настоящее время я конвертирую палитровое изображение в RGB в программном обеспечении, а затем помещаю его в D3DUSAGE_DYNAMIC
текстура (которая заблокирована с D3DLOCK_DISCARD
).
Есть ли более быстрый способ? Например, используя шейдеры для выполнения палитризации?
Смежные вопросы:
- Быстрый палитра экрана с OpenGL - тот же вопрос с OpenGL
- Как улучшить производительность потоковой текстуры Direct3D? - аналогичный вопрос от автора SDL
2 ответа
Создать D3DFMT_L8
текстура, содержащая изображение с палитрой и 256x1 D3DFMT_X8R8G8B8
изображение, содержащее палитру.
Код шейдера HLSL:
uniform sampler2D image;
uniform sampler1D palette;
float4 main(in float2 coord:TEXCOORD) : COLOR
{
return tex1D(palette, tex2D(image, coord).r * (255./256) + (0.5/256));
}
Обратите внимание, что яркость (индекс палитры) регулируется с помощью операции многократного добавления. Это необходимо, поскольку индекс 255 палитры рассматривается как белый (максимальная яркость), который становится равным 1,0f, когда он представлен как число с плавающей точкой. Чтение текстуры палитры по этой координате заставляет ее обернуться (так как используется только дробная часть) и прочитать вместо нее первую запись палитры.
Скомпилируйте это с:
fxc /Tps_2_0 PaletteShader.hlsl /FhPaletteShader.h
Используйте это так:
// ... create and populate texture and paletteTexture objects ...
d3dDevice->CreatePixelShader((DWORD*)g_ps20_main, &shader)
// ...
d3dDevice->SetTexture(1, paletteTexture);
d3dDevice->SetPixelShader(shader);
// ... draw texture to screen as textured quad as usual ...
Вы можете написать простой пиксельный шейдер для обработки палитры. Создайте динамическую текстуру L8, скопируйте на нее свое палитризованное изображение и создайте текстуру поиска палитры (или массив цветов в постоянной памяти). Затем просто визуализируйте полноэкранный четырехугольник с палитризованным изображением, установленным в качестве текстуры, и пиксельным шейдером, который выполняет поиск палитры из текстуры поиска или постоянного буфера.
Тем не менее, выполнение преобразования палитры на процессоре не должно быть очень дорогим на современном процессоре. Вы уверены, что это ваше узкое место в производительности?