предупреждение X4000: использование потенциально неинициализированной переменной

Компилятор HLSL выдает сообщение об ошибке "предупреждение X4000: использование потенциально неинициализированной переменной" со следующим кодом:

float4 GetPixelColorFromRawImage(
    in ByteAddressBuffer Source,
    in uint2             SourceSize,
    in uint2             XY)
{
    // Check if within range
    if (any(XY >= SourceSize))
        return float4(0.5, 0.0, 0.0, 1.0);  // <<<==== WARNING HERE

    if (BytesPerPixel == 3) {
        // 24 bits RGB color image
        uint4 RGBA = GetPixelRGBAFromRawImage(Source, SourceSize, XY);
        return float4(RGBA.r / 256.0,
                      RGBA.g / 256.0,
                      RGBA.b / 256.0,
                      RGBA.a / 256.0);
    }
    else if (BytesPerPixel == 2) {
        // 16 bit grayscale image
        uint  Gray1 = GetPixel16BitGrayFromRawImage(Source, SourceSize, XY);
        uint  Gray2 = GetByteFromUInt(LUT16.Load(Gray1 & (~3)), Gray1 & 3);
        float Gray3 = (float)Gray2 / 256.0;
        return float4(Gray3, Gray3, Gray3, 1.0);
    }
    else {
        return float4(0.0, 0.0, 0.0, 1.0);
    }
}

Я не понимаю этого предупреждения. В строке нарушения вообще не используется переменная!

Любая помощь приветствуется.


person fpiette    schedule 30.08.2019    source источник
comment
any(XY >= SourceSize) выглядит подозрительно, зачем вам проверять биты логического значения?   -  person user7860670    schedule 31.08.2019
comment
@VTT Для оператора if требуются однокомпонентные логические значения. Сравнение нескольких переменных компонентов возвращает несколько логических значений компонентов, которые вы конвертируете в однокомпонентные логические значения с помощью any() или all().   -  person kefren    schedule 01.09.2019


Ответы (1)


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

Вы можете попробовать небольшой обходной путь.

В начале вашего метода определите и создайте экземпляр переменной, затем обновите ее в ifs и верните ее.

float4 GetPixelColorFromRawImage(
    in ByteAddressBuffer Source,
    in uint2             SourceSize,
    in uint2             XY)
{
    float4 returnVar = float4(0.0, 0.0, 0.0, 0.0);
    // Check if within range
    if (any(XY >= SourceSize))
        returnVar = float4(0.5, 0.0, 0.0, 1.0);  

    if (BytesPerPixel == 3) {
        // 24 bits RGB color image
        uint4 RGBA = GetPixelRGBAFromRawImage(Source, SourceSize, XY);
        returnVar = float4(RGBA.r / 256.0,
                      RGBA.g / 256.0,
                      RGBA.b / 256.0,
                      RGBA.a / 256.0);
        }
    else if (BytesPerPixel == 2) {
        // 16 bit grayscale image
        uint  Gray1 = GetPixel16BitGrayFromRawImage(Source, SourceSize, XY);
        uint  Gray2 = GetByteFromUInt(LUT16.Load(Gray1 & (~3)), Gray1 & 3);
        float Gray3 = (float)Gray2 / 256.0;
        returnVar = float4(Gray3, Gray3, Gray3, 1.0);
        }
    else {
        returnVar = float4(0.0, 0.0, 0.0, 1.0);
        }
    return returnVar;
}
person kefren    schedule 01.09.2019
comment
Я отправил сообщение с iPad и не могу проверить свой код, если есть опечатки, дайте мне знать, чтобы я мог их исправить (или не стесняйтесь исправлять их самостоятельно в своем ответе) - person kefren; 01.09.2019
comment
Как вы сказали, он работает с использованием промежуточной переменной. Я отметил ваш ответ как принятый. Большое спасибо. - person fpiette; 03.09.2019
comment
Отлично, я рад, что помог. Кстати, я вижу, вы не приняли ответы на два предыдущих вопроса. Я хотел бы знать, не помогли ли они вам, и если вы решили сделать что-то другим (лучшим) способом… Как вы видели, вычислительные шейдеры — это не то место, где вы получаете нашел лучшие способы, которые могут быть поучительны для меня. - person kefren; 04.09.2019
comment
Я принял ответы на предыдущие вопросы. Если я пропущу один, дайте мне знать, какой. Изучить прямые вычисления непросто, здесь много ловушек, а компилятор ведет себя странно для новичка [в HLSL] вроде меня. Спасибо за помощь! - person fpiette; 05.09.2019
comment
Я согласен, GPGPU это совсем не просто. В конце концов, учтите, что мы используем GPU для чего-то, для чего он не предназначен... часть сложности заключается в том, что очень мало документации, и очень немногие люди этим занимаются, и те, кто может это сделать, обычно хранят свои секреты, потому что это своего рода нишевая работа... И остальные кодеры считают это чем-то вроде магии :D - person kefren; 09.09.2019