为什么在这个变量面前需要'静态'?

时间:2013-10-27 17:58:14

标签: static hlsl

文档没有说明这种行为:

Variable Syntax

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 的正常结果:

enter image description here enter image description here

不使用静态时错误:

enter image description here enter image description here

这是完整的代码:

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);
}

1 个答案:

答案 0 :(得分:3)

您必须自己管理非静态变量的内存。因此,当使用静态时,一切都按预期工作,因为编译器关心保留一些内存,它可以存储过滤器值。如果静态不存在,则必须自己管理内存 - 这意味着您必须检索变量的默认值并手动将其复制到常量缓冲区。