不处于dx9兼容模式时,是否禁用DX9样式intristics?

时间:2018-11-13 14:54:34

标签: directx-11 hlsl

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

  

不在dx9兼容模式下时,将禁用DX9样式intristics。 (LN#:19)

这告诉我代码中的第19行就是问题所在,我相信这是由于该特定行中的tex2DSampler造成的。

#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;
}

有关代码和我的问题的注释,请参见下文。


注释

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

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

我的问题

  • 我在Sampler调用中为tex2D使用了错误的数据类型吗?
  • {{1}中已弃用tex2D吗?
  • 我应该改用什么?
  • 我在这里做错什么,因为那是我唯一的错误。

1 个答案:

答案 0 :(得分:2)

经过广泛的搜索,我发现tex2D及更高版本不再支持ps_4_0。好吧,4_0可以在旧版模式下运行,但是5_0不能用,这就是我正在使用的模式。

  

着色器模型:受支持

     

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

已被Texture2D取代; documentation可用。以下是上述文档的示例:

// 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;

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

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

另外,请注意,本文中的代码是针对高斯模糊的水平传递的。