Directx 警告X4000:使用可能未初始化的变量

Directx 警告X4000:使用可能未初始化的变量,directx,hlsl,directcompute,Directx,Hlsl,Directcompute,HLSL编译器发出错误消息“警告X4000:使用可能未初始化的变量”,代码如下: float4 GetPixelColorFromRawImage( in ByteAddressBuffer Source, in uint2 SourceSize, in uint2 XY) { // Check if within range if (any(XY >= SourceSize)) ret

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);
    }
}
float4从RawImage获取像素颜色(
在ByteAddressBuffer源中,
在uint2源大小中,
在uint2(XY)中
{
//检查是否在范围内
如果(有(XY>=源大小))

return float4(0.5,0.0,0.0,1.0);//编译器有时会对中间
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;
}

any(XY>=SourceSize)
看起来可疑,为什么要检查布尔值位?@VTT如果
运算符需要单分量布尔值,则
运算符需要单分量布尔值。比较多分量变量会返回多分量布尔值,您可以使用
any()
all()将其转换为单分量布尔值
。我在iPad上发布,无法检查我的代码,如果有拼写错误,请告诉我,以便我可以更正(或者在我的回答中自己更正)正如你所说,它使用中间变量工作。我将你的答案标记为已接受。非常感谢。很好,我很高兴我提供了帮助。顺便说一句,我看到你没有接受前两个问题的答案。我想知道他们是否对你没有帮助,以及你是否决定做其他事情(更好)方式…正如你所看到的,计算着色器并不是吸引成千上万人的地方,如果你找到了更好的方法,它可能会对我有启发。我已经接受了前面的问题的asnwers。如果我错过了一个,请让我知道。学习直接计算并不容易,有很多陷阱,对于初学者来说编译器有奇怪的行为[在HLSL中]像我一样。谢谢你的帮助。我同意,GPGPU根本不容易。毕竟,我们认为我们正在使用GPU做一些不该做的事情……难度的一部分是很少的文档,而且很少有人这样做,而这样做通常能保持他们的秘密,因为这是一种利基工作……而且是C。其他程序员认为这是一种魔力:D