Как использовать 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;
Это никак не связано с макетами ввода. Это просто способ работы сэмплера текстуры.