我有一个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;
}
答案 0 :(得分:0)
packoffset正是它的声音:偏移,而不是范围。这意味着它只是指示变量应该从哪里开始。 xyz指的是3个不同的位置,但当然,你不能在3个位置启动变量,这就是你得到错误的原因。你真正想要的是你的新变量从y开始,所以试试packoffset(c0.y)而不是c0.yzw