2014-12-04 61 views
0

我有一個HLSL着色器,當我將特定變量添加到常量緩衝區時,出現意外錯誤。整個着色器在下面。爲了排除一切,我包含了整個着色器。HLSL常量緩衝區包裝意外錯誤

當我將NewVariable添加到第三個常量緩衝區時發生錯誤。

我沒有在文檔中發現這一點,但其中一個矢量開始部分的方式進入C0矢量我不能執行以下包裝?

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

我得到的不良記錄錯誤X3530(ERR_BIND_INVALID)。 MSDN說:「執行了無效的綁定操作,例如,緩衝區只能綁定到一個槽或一個常量偏移量;無效的寄存器規範,因爲預期會發生特定的綁定但不會發生;不能將packoffset元素與非包含偏移量元素在一個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; 
} 

回答

0

packoffset正是它聽起來像:偏移,而不是範圍。這意味着它只是表示變量應該開始的位置。 xyz指的是3個不同的位置,但自然,你不能在3個位置啓動一個變量,這就是爲什麼你會得到一個錯誤。你真正想要的是你的新變量從y開始,所以試試packoffset(c0.y)而不是c0.yzw