2013-10-27 2 views
0

документации не говорит много об этом поведении:Зачем нужна «статическая» перед этой переменной?

Variable Syntax

статическойМарка локальных переменной, так что она инициализируется один раз и сохраняется между вызовами функций. Если декларация не включает инициализатор, значение устанавливается равным нулю. Глобальная переменная с пометкой static не отображается в приложении.

Можете ли вы объяснить, почему удаление статического модификатора из матриц вызывает неожиданный выход?

static float3x3 protanopia ={ 
    0.567f, 0.433f, 0.000f, 
    0.558f, 0.442f, 0.000f, 
    0.000f, 0.242f, 0.758f, 
}; 

Нормальный результат с статическим:

enter image description hereenter image description here

Некорректное без статического:

enter image description hereenter image description here

Вот комп lete code:

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

ответ

3

Вы сами должны управлять памятью нестатических переменных. Поэтому при использовании static все работает так, как ожидалось, поскольку компилятор заботится о резервировании некоторой памяти, где он может хранить значения фильтра. Если статичность отсутствует, вам нужно самостоятельно управлять памятью - это означает, что вам нужно получить значение по умолчанию для переменной и скопировать ее вручную в буфер.

+0

Спасибо за объяснения. – Aybe

Смежные вопросы