【问题标题】:Why does this HLSL pixel shader not compile?为什么这个 HLSL 像素着色器无法编译?
【发布时间】:2022-02-03 06:19:39
【问题描述】:

我正在研究光线追踪像素着色器,但遇到了一个奇怪的错误。我编写以下代码只是为了生成错误,这毫无意义,但我无法弄清楚它有什么问题。

float4 main(/*Any input*/) : SV_TARGET
{
    uint uints[2];
    float4 light[2];
    uints[0] = 0;
    uints[1] = 0;
    uint c = 1;
    [loop] while (c > 0) {
        if (uints[c] == 0)
            light[c - 1] = 0.0f;
        else
            light[c - 1] = 0.0f;
        c--;
        break;
    }
    return light[0];
}

使用着色器模型 5_0 编译时(有和没有优化)我得到以下错误:

error MSB6006: "fxc.exe" exited with code -1073741819

对代码做一些看似毫无意义的事情,比如删除c--;,可以消除错误。谁能弄清楚这个奇怪的错误是从哪里来的?

【问题讨论】:

  • 您使用的是哪个版本的 FXC.EXE?尝试直接从命令行编译以查看更好的诊断。如果您上面的代码 sn-p 是可构建的,但您没有包含您对 PS_INPUT 的定义,这也会有所帮助。
  • @ChuckWalbourn 我正在使用来自最新 Windows 10 SDK (10.0.19041.0) (x64) 的 fxc.exe。据我所知,输入无关紧要。我也得到了没有任何输入的错误。

标签: hlsl pixel-shader


【解决方案1】:

在我的情况下,如果我删除 [loop] 标签,它就会编译。

    // Compiling pixel shader
    ComPtr<ID3DBlob> pixelBlob = nullptr;
    ComPtr<ID3DBlob> pixelErrorBlob = nullptr;
    result = D3DCompile(pixelShaderByteCode.c_str(),
                        pixelShaderByteCode.length(),
                        nullptr,
                        nullptr,
                        nullptr,
                        "main", "ps_5_0",
                        compileFlags, 0,
                        pixelBlob.GetAddressOf(),
                        pixelErrorBlob.GetAddressOf());
float4 main(PixelInput input) : SV_TARGET
{
    uint uints[2];
    float4 light[2];
    uints[0] = 0;
    uints[1] = 0;
    uint c = 1;
    while (c > 0) {
        if (uints[c] == 0)
        light[c - 1] = 0.0f;
        else
        light[c - 1] = 0.0f;
        c--;
        break;
    }
    return light[0];
}

【讨论】:

  • 是的,它通过做一些小改动来工作,但我不是要修复代码,只是了解它有什么问题。
  • 哦,好吧,我没有找到“[loop]”标签的任何文档,也许它破坏了编译器。它会产生分段错误 c0000005
  • 奇怪,根据this documentation [loop] 属性可以让你Generate code that uses flow control to execute each iteration of the loop. 并且通常对我来说编译得很好。它只是从产生错误的 if/else 语句中的可变变量索引的数组中读取/写入,我觉得这很奇怪,可能是编译器中的错误。
  • 也许它们只适用于计算着色器而不是像素着色器。我不确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多