Почему этот шейдер не компилируется на уровне 4_0 9_3 - PullRequest
0 голосов
/ 23 апреля 2019

Я использую VS 2019 Community, с DirectX SDK, который входит в стандартную установку VS.

Источник шейдера:

cbuffer Params : register(b1)
{
    float4 param1;
    float4 param2;
    float4 frameNum;      // Not used in this shader
    float4 depthBias;     // Not used in this shader
};

cbuffer Gradients : register(b2)
{
    float2 gradients[160];
};

Texture2D srcTexture : register(t0);         // Not used in this shader
SamplerState linearSampler : register(s0);   // Not used in this shader

struct PS_INPUT
{
    float4 position : SV_POSITION;
    float2 texcoord0 : TEXCOORD0;
    float2 texcoord1 : TEXCOORD1;   // Not used in this shader
};

float dotGridGradient(int i, float x, float y)
{
    return gradients[i].x * x + gradients[i].y * y;
}

float4 PLASmain(PS_INPUT IN) : SV_Target
{
    // Perlin noise plasma generator from https://en.wikipedia.org/wiki/Perlin_noise#Implementation
    float x = saturate(IN.texcoord0.x) * 15.999;
    float y = saturate(IN.texcoord0.y) * 8.999;
    int xi = floor(x);
    int yi = floor(y);
    x -= xi;
    y -= yi;
    int i = yi * 16 + xi;
    float g0 = dotGridGradient(i, x, y);
    float g1 = dotGridGradient(i + 1, x, y);
    float g2 = dotGridGradient(i + 16, x, y);
    float g3 = dotGridGradient(i + 17, x, y);
    float l0 = lerp(g0, g1, x);
    float l1 = lerp(g2, g3, x);
    float l2 = lerp(l0, l1, y) / 2 + 0.5;
    float4 result = lerp(param1, param2, l2);
    return result;
}

При компиляции с набором модели шейдера4_0 параметры командной строки следующие:

/E"PLASmain" /Vn"plasmaShader" /ps"_4_0" /Fh"...\plasmaShaderRelease.hxx" /nologo 

Это прекрасно компилируется и создает рабочий шейдер.Однако, если я изменю модель шейдера на 4_0 level 9_3, параметры командной строки переключатся на:

/E"PLASmain" /Vn"plasmaShader" /ps"_4_0_level_9_3" /Fh"...\plasmaShaderRelease.hxx" /nologo 

, и на выходе появятся следующие ошибки:

1>...\Shaders\plasmaShader.psh(34,15): error X5589: Invalid const register num: 162. Max allowed is 31.
1>...\Shaders\plasmaShader.psh(27,12-23): error X4505: maximum temp register index exceeded
1>...\Shaders\plasmaShader.psh(27,12-23): error X4505: maximum temp register index exceeded
1>...\Shaders\plasmaShader.psh(27,33-44): error X4505: maximum temp register index exceeded
1>...\Shaders\plasmaShader.psh(27,33-44): error X4505: maximum temp register index exceeded

с X4505 ошибка повторяется более 300 раз.

...