该文档并没有太多说明这种行为:
static 标记一个局部变量,以便它被初始化一次并在函数调用之间保持不变。如果声明不包含初始值设定项,则该值设置为零。标记为静态的全局变量对应用程序不可见。
你能解释为什么从矩阵中删除静态修饰符会产生意外的输出吗?
static float3x3 protanopia ={
0.567f, 0.433f, 0.000f,
0.558f, 0.442f, 0.000f,
0.000f, 0.242f, 0.758f,
};
使用静态的正常结果:
没有静态的不正确:
这是完整的代码:
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);
}