2011-04-29 2 views
0

Je suis un nouveau HLSL et j'essaie de comprendre un échantillon pixelisé. Cependant, je n'ai pas été en mesure de trouver une référence sur la façon dont quelques opérations sont. Voici l'exemple de shaders:Aide à comprendre l'effet Pixelate

//-------------------------------------------------------------------------------------- 
// 
// WPF ShaderEffect HLSL -- PixelateEffect 
// 
//-------------------------------------------------------------------------------------- 

//----------------------------------------------------------------------------------------- 
// Shader constant register mappings (scalars - float, double, Point, Color, Point3D, etc.) 
//----------------------------------------------------------------------------------------- 

float HorizontalPixelCounts : register(C0); 
float VerticalPixelCounts : register(C1); 

//-------------------------------------------------------------------------------------- 
// Sampler Inputs (Brushes, including ImplicitInput) 
//-------------------------------------------------------------------------------------- 

sampler2D implicitInputSampler : register(S0); 


//-------------------------------------------------------------------------------------- 
// Pixel Shader 
//-------------------------------------------------------------------------------------- 

float4 main(float2 uv : TEXCOORD) : COLOR 
{ 
    float2 brickCounts = { HorizontalPixelCounts, VerticalPixelCounts }; 
    float2 brickSize = 1.0/brickCounts; 

    // Offset every other row of bricks 
    float2 offsetuv = uv; 
    bool oddRow = floor(offsetuv.y/brickSize.y) % 2.0 >= 1.0; 
    if (oddRow) 
    { 
     offsetuv.x += brickSize.x/2.0; 
    } 

    float2 brickNum = floor(offsetuv/brickSize); 
    float2 centerOfBrick = brickNum * brickSize + brickSize/2; 
    float4 color = tex2D(implicitInputSampler, centerOfBrick); 

    return color; 
} 

Je n'ai pas été en mesure de comprendre ce qui se passe dans le calcul:

float2 brickNum = floor(offsetuv/brickSize); 

Je ne suis pas sûr de ce que la façon de calculer la division entre les deux vecteurs, et aussi je ne sais pas comment calculer le plancher d'un vecteur. (Je suppose que la division de deux float2 renvoie un float2).

Une idée?

Répondre

1

Les opérateurs et fonctions HLSL fonctionnent souvent avec des structures comme float2 qui a un x et un y.

La division à l'intérieur du sol retourne un float2 où le x et y sont le résultat de la division du x avec x et y avec y. Et étage retournera un float2 où le x et y du résultat sont la valeur plancher des x et y de l'entrée (le résultat de la division).

La même chose est vraie pour float3 et d'autres structures similaires.

Questions connexes