Интристика в стиле DX9 отключена, когда не в режиме совместимости с dx9? - PullRequest
0 голосов
/ 13 ноября 2018

В настоящее время я пишу шейдер HLSL для базового размытия по Гауссу. Код шейдера прост, но я получаю сообщение об ошибке:

Интристика в стиле DX9 отключена, когда не в режиме совместимости с dx9. (LN #: 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;
}

См. Примечания о коде и мои вопросы ниже.


Примечания

Я должен вручную ввести свой код в StackOverflow, поскольку мой код находится на компьютере без подключения. Поэтому:

  • Никаких орфографических или падежных ошибок, присутствующих здесь, в коде не существует.
  • Отсутствие значений внутри offsets и weights является преднамеренным.
    • Это потому, что в каждом есть 21 значение, и мне не хотелось вводить их все.
    • offsets - каждое целое число от -10 до 10.
    • weights варьируется от 0.01 до 0.25 и обратно до 0.01.
  • Количество строк здесь меньше из-за отсутствия, упомянутого ранее.
    • Номер строки ошибки здесь 15.
    • Диапазон столбцов 13 - 59, который инкапсулирует tex2D и Sampler.

Мои вопросы

  • Использую ли я неправильный тип данных для Sampler в вызове tex2D?
  • Является ли tex2D устаревшим в DirectX 11?
  • Что я должен использовать вместо этого?
  • Что я здесь не так делаю, так как это моя единственная ошибка.

1 Ответ

0 голосов
/ 13 ноября 2018

После долгих поисков я обнаружил, что tex2D больше не поддерживается с ps_4_0 и выше.Ну, 4_0 будет работать в унаследованном режиме, но он не работает 5_0, что я и использую.

Модель шейдера: Поддерживается

Shader Model 4: да (только пиксельный шейдер), но вы должны использовать устаревшую опцию компиляции при компиляции.
Shader Model 3 (DirectX HLSL): да (только пиксельный шейдер)
Shader Model 2 (DirectX HLSL): yes (пиксель)только шейдер)
модель шейдера 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];

Также обратите внимание, что код в этом посте предназначен длягоризонтальный проход гауссова размытия.

...