【问题标题】: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_UNORMD3DFMT_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;
    

    这与输入布局无关。这正是纹理采样器的工作方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多