Внутренняя ошибка компилятора шейдера Direct3D X8000: неверный байт-код - PullRequest
0 голосов
/ 23 сентября 2019

При компиляции этого простого пиксельного шейдера:

Texture2D tex0 : register(t0);
Texture2D tex1 : register(t1);

SamplerState s : register(s0);

float4 main(float2 tc : TEXCOORD0) : SV_TARGET
{
    Texture2D tex = tex0;
    if (tc.x > 0.5)
    {
        tex = tex1;
    }
    return tex.SampleLevel(s, tc, 0);
}

Используя командную строку fxc.exe /T ps_4_0 hello.hlsl Я получаю:

Microsoft (R) Direct3D Shader Compiler 10.1 (using C:\Windows Kits\10\bin\10.0.17763.0\x86\D3DCOMPILER_47.dll)
Copyright (C) 2013 Microsoft. All rights reserved.

error X8000: D3D11 Internal Compiler Error: Invalid Bytecode: Invalid operand type for operand #3 of opcode #8 (counts are 1-based).
error X8000: D3D11 Internal Compiler Error: Invalid Bytecode: Can't continue validation - aborting.

Что я делаю не так?

1 Ответ

1 голос
/ 23 сентября 2019

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

Texture2D tex0 : register(t0);
Texture2D tex1 : register(t1);

SamplerState s : register(s0);

float4 main(float2 tc : TEXCOORD0) : SV_TARGET
{
    if (tc.x > 0.5)
    {
        return tex1.SampleLevel(s, tc, 0);
    }
    else
    {
        return tex0.SampleLevel(s, tc, 0);
    }
}

Обратите внимание, что компилятор DXIL для Shader Model 6 возвращает более заметную ошибку в этом случае:

ошибка: локальный ресурс не гарантируется для сопоставления с уникальным глобальным ресурсом.Используйте / Zi для исходного местоположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...