Как использовать swizzle .rrrg в шейдере Directx11

Я должен создать текстуру с эквивалентным форматом от D3DFMT_A8L8 в DirectX9 до DirectX11. Но примечание в документации мне не понятно. Кто-нибудь объяснит, что должно быть сделано? При создании макета ввода я сталкиваюсь с ошибкой неверного параметра.

D3DFMT_A8L8 => DXGI_FORMAT_R8G8_UNORM Примечание. Используйте swizzle .rrrg в шейдере, чтобы дублировать красный, и переместите зеленый в альфа-компоненты, чтобы получить поведение Direct3D 9.

1 ответ

Решение

В Direct3D 9 форматы "Яркость" будут автоматически считываться в шейдере как значения RGB (тиражируются), поскольку они были в оттенках серого. В Direct3D 10+ нет формата "Яркость". Существует один и два формата каналов, и с ними нет "особого поведения".

Поэтому в шейдере DXGI_FORMAT_R8G8_UNORM текстура будет иметь первый канал в канале 'r' и второй канал в канале 'g'. DXGI_FORMAT_R8G8_UNORM имеет тот же отпечаток памяти, что и D3DFMT_A8L8т. е. два 8-битных канала нормальных целочисленных данных без знака, но если вы хотите, чтобы поведение современного шейдера соответствовало старому, вы должны сделать это явно с помощью шейдеров:

Texture2D<float4> Texture : register(t0);
sampler Sampler : register(s0);

float4 color = Texture.Sample(Sampler, pin.TexCoord);

// Special-case for DXGI_FORMAT_R8G8_UNORM treated as D3DFMT_A8L8
color = color.rrrg;

Это никак не связано с макетами ввода. Это просто способ работы сэмплера текстуры.

Другие вопросы по тегам