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

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

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


person Tajuddin Khandaker    schedule 07.02.2019    source источник


Ответы (1)


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

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

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;

Это не имеет ничего общего с макетами ввода. Именно так работает сэмплер текстуры.

person Chuck Walbourn    schedule 07.02.2019