0

该文档并没有太多说明这种行为:

变量语法

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

1 回答 1

3

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

于 2014-01-09T20:55:49.880 回答