不在dx9兼容模式下,DX9样式内置被禁用?

问题描述 投票:3回答:1

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

不在dx9兼容模式下,DX9样式内置被禁用。 (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

我的问题

  • 我在tex2D调用中使用了错误的Sampler数据类型吗?
  • DirectX 11是否弃用tex2D
  • 我应该用什么呢?
  • 我在这里做错了什么,因为这是我唯一的错误。
directx-11 hlsl
1个回答
2
投票

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

着色器模型:支持

着色器模型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;

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.