HLSL常量缓冲区打包意外错误

时间:2014-12-04 17:52:39

标签: directx-11 hlsl

我有一个HLSL着色器,当我将一个特定变量添加到常量缓冲区时会出现意外错误。整个着色器在下面。为了统治一切,我包括整个着色器。

NewVariable添加到第三个常量缓冲区时发生错误。

我在文档中没有找到这个,但是我可以不执行以下打包,其中向量在c0向量中部分开始吗?

float1 var1 : packoffset( c0.x );
float3 var2 : packoffset( c0.yzw );

我得到了错误记录的错误X3530(ERR_BIND_INVALID)。 MSDN说,“执行了无效的绑定操作。例如,缓冲区只能绑定到一个槽或一个常量偏移量;无效的寄存器规范,因为预期会发生特定绑定但不会发生;不能将packoffset元素与nonpackoffset元素混合在一个cbuffer。“这个错误信息确实没有告诉我什么是错的,包偏移对我来说是正确的。

cbuffer SceneGlobals : register( b0 )
{
    int NumAmbientLights : packoffset( c0 );
    int NumDirectionalLights : packoffset( c0.y );
    int NumPointLights : packoffset( c0.z );
    int NumSpotLights : packoffset( c0.w );
}

cbuffer FrameGlobals : register( b1 )
{
    float Time : packoffset( c0 );
    float Timestep : packoffset( c0.y );
    int NumCameras : packoffset( c0.z );
    float4 CameraPosition[1] : packoffset( c1 );
    float4x4 CameraView[1] : packoffset( c2 );
    float4x4 CameraProjection[1] : packoffset( c6 );
    float4x4 CameraViewProjection[1] : packoffset( c10 );
}

cbuffer ObjectGlobals : register( b2 )
{
    int ActiveCamera : packoffset( c0 );
    int3 NewVariable : packoffset( c0.yzw ); // ERROR OCCURS HERE
}


struct InputStruct
{
    float4 Position : POSITION;
    float4 Color : COLOR;
};

struct OutputStruct
{ 
    float4 Position : SV_POSITION0;
    float4 Color : COLOR0;
    float4 Normal : NORMAL0;
    float4 WorldPos : POSITION0;
    float4 TexCoords : TEXCOORD0;
};

OutputStruct VS( InputStruct Input )
{
    OutputStruct Output = (OutputStruct)0;
    Output.Position = mul(CameraViewProjection[ActiveCamera], Input.Position);
    Output.Color = Input.Color;
    return Output;
}

1 个答案:

答案 0 :(得分:0)

packoffset正是它的声音:偏移,而不是范围。这意味着它只是指示变量应该从哪里开始。 xyz指的是3个不同的位置,但当然,你不能在3个位置启动变量,这就是你得到错误的原因。你真正想要的是你的新变量从y开始,所以试试packoffset(c0.y)而不是c0.yzw