不在 dx9 兼容模式下时,DX9 风格特性被禁用?

Per*_*alJ 5 hlsl directx-11

我目前正在编写一个HLSL用于基本高斯模糊的着色器。着色器代码很简单,但我不断收到错误:

不在 dx9 兼容模式下时,DX9 风格特性将被禁用。(法律公告#:19)

这告诉我,我的代码中的第 19 行是问题所在,我相信它要么是由于该特定行引起的tex2D,要么是Sampler在该特定行中。

#include "Common.hlsl"

Texture2D Texture0 : register(t0);
SamplerState Sampler : register(s0);

float4 PSMain(PixelShaderInput pixel) : SV_Target {
    float2 uv = pixel.TextureUV; // This is TEXCOORD0.
    float4 result = 0.0f;

    float offsets[21] = { ... };
    float weights[21] = { ... };

    // Blur horizontally.
    for (int x = 0; x < 21; x++)
        result += tex2D(Sampler, float2(uv.x + offsets[x], uv.y)) * weights[x];

    return result;
}
Run Code Online (Sandbox Code Playgroud)

请参阅下面有关代码的注释和我的问题。


笔记

由于我的代码位于没有连接的计算机上,因此我必须手动将代码输入 StackOverflow。所以:

  • 代码中不存在此处出现的任何拼写或大小写错误。
  • offsets和内部没有值weights是故意的。
    • 这是因为每个值都有 21 个值,我不想将它们全部输入。
    • offsets-10是从到 的每个整数10
    • weights范围从0.010.25和返回 到0.01
  • 由于前面提到的缺失,此处的行数较少。
    • 这里错误的行号是15
    • 列范围13 - 59封装了tex2DSampler

我的问题

  • Sampler我在通话中使用了错误的数据类型吗tex2D
  • tex2D弃用DirectX 11
  • 我应该用什么来代替?
  • 我在这里做错了什么,因为这是我唯一的错误。

Per*_*alJ 4

经过一番广泛的搜索后,我发现从上往下tex2D不再支持它。ps_4_0好吧,4_0将在旧模式下工作,但它不起作用,这5_0正是我正在使用的。

着色器模型:支持

Shader Model 4:是(仅限像素着色器),但编译时必须使用旧版编译选项。
着色器模型 3 (DirectX HLSL):是(仅限像素着色器)
着色器模型 2 (DirectX HLSL):是(仅限像素着色器)
着色器模型 1 (DirectX HLSL):是(仅限像素着色器)

这已被替换为Texture2D;文档可供使用以下是上述文档中的示例:

// Object Declarations
Texture2D g_MeshTexture;    
SamplerState MeshTextureSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

struct VS_OUTPUT
{
    float4 Position   : SV_POSITION; 
    float4 Diffuse    : COLOR0;
    float2 TextureUV  : TEXCOORD0; 
};

VS_OUTPUT In;

// Shader body calling the intrinsic function
Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
Run Code Online (Sandbox Code Playgroud)

要替换tex2D我的代码中的调用:

result += Texture0.Sample(Sampler, float2(uv.x + offsets[x], uv.y)) * weights[x];
Run Code Online (Sandbox Code Playgroud)

另请注意,本文中的代码用于高斯模糊的水平传递。