文档没有说明这种行为:
static 标记一个局部变量,使其初始化一次并在函数调用之间保持不变。如果声明不包含初始值设定项,则该值设置为零。标记为static的全局变量对应用程序不可见。
你能解释为什么从矩阵中删除 static 修饰符会产生意外的输出吗?
static float3x3 protanopia ={
0.567f, 0.433f, 0.000f,
0.558f, 0.442f, 0.000f,
0.000f, 0.242f, 0.758f,
};
static 的正常结果:
不使用静态时错误:
这是完整的代码:
sampler2D input : register(s0);
// new HLSL shader
// modify the comment parameters to reflect your shader parameters
/// <summary>Explain the purpose of this variable.</summary>
/// <minValue>0/minValue>
/// <maxValue>8</maxValue>
/// <defaultValue>0</defaultValue>
float Filter : register(C0);
static float3x3 norm ={
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
};
static float3x3 protanopia ={
0.567f, 0.433f, 0.000f,
0.558f, 0.442f, 0.000f,
0.000f, 0.242f, 0.758f,
};
float4 main(float2 uv : TEXCOORD) : COLOR
{
int filter = (int)abs(Filter);
float3x3 mat;
switch (filter)
{
case 0:
mat = norm;
break;
case 1:
mat=protanopia;
break;
default:
break;
}
float4 color = tex2D( input , uv.xy);
float3 rgb = {
color.x * mat._m00 + color.y * mat._m01 + color.z * mat._m02,
color.x * mat._m10 + color.y * mat._m11 + color.z * mat._m12,
color.x * mat._m20 + color.y * mat._m21 + color.z * mat._m22
};
return float4(rgb,1);
}
答案 0 :(得分:3)
您必须自己管理非静态变量的内存。因此,当使用静态时,一切都按预期工作,因为编译器关心保留一些内存,它可以存储过滤器值。如果静态不存在,则必须自己管理内存 - 这意味着您必须检索变量的默认值并手动将其复制到常量缓冲区。