Hull着色器中重叠的寄存器?

时间:2013-08-19 18:41:24

标签: directx shader tessellation

我正在进行一些硬件细分并设法获得基本细分效果,因此尝试继续使用Phong细分(用于舍入边缘)。现在,当我想在补丁常量函数中添加额外的输出并写入它们时,其中一个会抛出错误。

struct ConstantOutputType
{
    float edges[3] : SV_TessFactor;
    float inside : SV_InsideTessFactor;

    float3 f3B0 : POSITION0;
    float3 f3B1 : POSITION1;
    float3 f3B2 : POSITION2;

    float3 f3N0 : NORMAL0;
    float3 f3N1 : NORMAL1;
    float3 f3N2 : NORMAL2;
};

ConstantOutputType PatchConstantFunction(InputPatch<HullInputType, 3> inputPatch, uint patchId : SV_PrimitiveID)
{    
    ConstantOutputType output = (ConstantOutputType)0;


    // Set the tessellation factors for the three edges of the triangle.
    output.edges[0] = inputPatch[0].dep;
    output.edges[1] = inputPatch[1].dep;
    output.edges[2] = inputPatch[2].dep;

    // Set the tessellation factor for tessallating inside the triangle.
    output.inside = (inputPatch[0].dep + inputPatch[1].dep + inputPatch[2].dep)/3.0f;


    output.f3B0 = inputPatch[0].pos.xyz;
    output.f3B1 = inputPatch[1].pos.xyz;
    output.f3B2 = inputPatch[2].pos.xyz;

    //output.f3N0 = inputPatch[0].nor.xyz;  <=====This throws the error (setting the normal)
    output.f3N1 = inputPatch[1].nor.xyz;
    output.f3N2 = inputPatch[2].nor.xyz;

    return output;
} 

抛出的错误是: 错误X8000:D3D11内部编译器错误:无效字节码:寄存器1的输入声明的组件与同一寄存器的先前声明重叠。操作码#47(计数从1开始)。 错误X8000:D3D11内部编译器错误:无效字节码:无法继续验证 - 中止。 我似乎无法弄清楚它的含义(鉴于这是我对船体着色器的第一次尝试)。

如果我对此进行评论,则可行,如果我为其设置了一个仲裁值,它也可以工作(例如:output.f3N0 = float3(0,1,0))。 我也尝试改变变量的语义,但没有帮助。 如果有人能给我一些见解,我会很高兴。

更新: 船体输入遵循要求:

struct HullInputType
{
    float3 pos              : POSITION;
    float2 tex              : TEXCOORD0;
    float3 nor              : TEXCOORD1;
    float  dep              : TEXCOORD2;
};

1 个答案:

答案 0 :(得分:3)

好的,似乎是外壳着色器输入结构中的(float dep:TEXCOORD2;)是问题所在。可能因为着色器单元处理float4寄存器,两个float3变量无法连接,但float2和float连接到float4寄存器。它与两个float2相同,但float2和float3不能连接,也不会重叠。所以我想我会在float3变量中用(float2 tex)发送深度(float dep)信息。

有趣的是,它适用于某人。在我的域到像素着色器中,这种方式不会与寄存器重叠。

更新:它不起作用,错误消失了,我可以编译着色器,但如果我尝试通过从输入结构分配它来使用该变量,那么整个图形渲染就会停止工作(即使是未经上映的电话)。这发生在HARDWARE设备上,在WARP上以某种方式工作。

UPDATE2:现在我通过发送float4s来修复它,但我不喜欢那一点。很奇怪,我不需要在我的顶点和像素着色器中这样做,也许这是一个小故障?或者可能是GPU硬件不兼容(Nvidia GT525M)。