为什么在引用RWStructuredBuffer时不会编译此HLSL Pixel Shader?

时间:2016-08-03 00:57:20

标签: directx shader hlsl pixel-shader directx-12

我正在使用DirectX 12,尝试使用无人机进行渲染。这是我的像素着色器代码:

    struct PSInput
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

struct FragmentDataStruct
{
    float4 color;
    float depth;
};

struct FragmentAndLinkStruct
{
    FragmentDataStruct fragmentData;
    uint nextFragment;
};

RWStructuredBuffer <FragmentAndLinkStruct> FLBuffer : register(u0);

RWByteAddressBuffer StartOffsetBuffer : register(u1);

float4 PSMain(PSInput input) : SV_TARGET
{
    input.color.x = float(FLBuffer[0].nextFragment);

    return input.color;
}

使用D3DCompileFromFile函数时,编译失败。

当我替换此行时:

input.color.x = float(FLBuffer[0].nextFragment);

有这样的事情:

FragmentAndLinkStruct otherThing;
otherThing.nextFragment = 1;
input.color.x = float(otherThing.nextFragment);

没有提及RWStructuredBuffer,那么它编译得很好并且正确呈现。

我认为绑定数据没有任何问题(VS Graphics Debugger显示两个UAV正确绑定)。不过,我认为这不会影响着色器的编译。

每当我引用FLBufferStartOffsetBuffer时,都不会编译。

什么会导致这个问题?

1 个答案:

答案 0 :(得分:0)

我在弄清楚如何读取编译器给出的错误后解决了这个问题。这里的问题是渲染目标输出使用u0着色器寄存器。

为了找到这一点,我使用下面的代码将D3DCompileFromFile转换为ID3DBlob*数组,将char*本地给出的错误作为error读出来,其中ID3DBlob*const char* error2 = static_cast<const char*>(error->GetBufferPointer());

error X4509: UAV registers live in the same name space as outputs, so they
must be bound to at least u1, manual bind to slot u0 failed

我在最后一行之后立即设置断点,只是从VS中的locals选项卡中读出错误消息:

struct PSInput
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

struct FragmentDataStruct
{
    float4 color;
    float depth;
};

struct FragmentAndLinkStruct
{
    FragmentDataStruct fragmentData;
    uint nextFragment;
};

RWStructuredBuffer <FragmentAndLinkStruct> FLBuffer : register(u1);

RWByteAddressBuffer StartOffsetBuffer : register(u2);

float4 PSMain(PSInput input) : SV_TARGET
{
    uint pixelCount = FLBuffer.IncrementCounter();
    input.color.x = float(pixelCount);

    return input.color;
}

错误消息非常简洁明了。非常有帮助。

更新的代码:

return

注意,编译器甚至不会查看对PSMain输出没有贡献的代码。我通过向与FLBuffer交互的input.color函数添加了一些代码来测试了这一点,而不会影响FLBuffer,这会被返回。查看反汇编,删除了所有多余的代码,而不是编译。

另外,由于我没有在它工作时引用u0,因此它没有在输出着色器寄存器和我绑定的CREATE TABLE `garment_master2` ( `GARMENT_ID2` int NOT NULL IDENTITY(1,1), `GARMENT_NAME1` varchar(50) NOT NULL, PRIMARY KEY (`GARMENT_ID2`), KEY `NDX_gar_name` (`GARMENT_NAME1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 着色器寄存器之间建立任何连接,因此没有出现任何问题。 / p>

然后我必须假设在完整性检查代码之前它会删除多余的代码,这在寻找效率时是有意义的。一旦进行完整性检查,就会继续编译。

希望这有助于某人稍后学习DirectX或HLSL。