0

ドキュメントでは、この動作についてはあまり説明されていません。

変数の構文

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での通常の結果:

ここに画像の説明を入力 ここに画像の説明を入力

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

1 に答える 1

3

非静的変数のメモリは自分で管理する必要があります。したがって、静的を使用すると、コンパイラはフィルタ値を格納できるメモリを確保することを考慮するため、すべてが期待どおりに機能します。static が存在しない場合は、メモリを自分で管理する必要があります。つまり、変数のデフォルト値を取得して、たとえば定数バッファーに手動でコピーする必要があります。

于 2014-01-09T20:55:49.880 に答える