【问题标题】:How to use swizzle .rrrg in directx11 shader如何在directx11着色器中使用swizzle .rrrg
【发布时间】:2019-02-07 05:07:11
【问题描述】:
我必须在directx9 到directx11 中创建具有等效格式D3DFMT_A8L8 的纹理。但是我不清楚文档中的注释。有人会解释应该做什么吗?在创建输入布局时,我面临无效参数错误。
D3DFMT_A8L8 => DXGI_FORMAT_R8G8_UNORM
注意:在着色器中使用 swizzle .rrrg 复制红色并将绿色移动到 alpha 组件以获得 Direct3D 9 行为。
【问题讨论】:
标签:
c++
directx-11
directx-9
texture2d
dxgi
【解决方案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;
这与输入布局无关。这正是纹理采样器的工作方式。