Как использовать swizzle .rrrg в шейдере Directx11 - PullRequest
0 голосов
/ 07 февраля 2019

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

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

1 Ответ

0 голосов
/ 07 февраля 2019

В 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;

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

...