我正在使用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正确绑定)。不过,我认为这不会影响着色器的编译。
每当我引用FLBuffer
或StartOffsetBuffer
时,都不会编译。
什么会导致这个问题?
答案 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。